在这种情况下,重载bool操作符是危险的

 歌手王紫璇 发布于 2023-02-12 18:05

我已经看到SoF上的评论或答案,说明将强制转换操作符重载到bool是危险的,我宁愿选择void* operator.我仍然想问一下,在我的用例中使用这个运算符是否危险,如果是,为什么.

我实现了一个简单的几何库,其中一个最基本的类是我用以下方式定义的一个点:

struct point {
  double x, y;
  bool real;
  point(double x_, double y_): x(x_), y(y_), real(true) {}
  point(): x(0), y(0), real(true) {}

  operator bool() {
    return real;
  }
};

我将尝试解释为什么我需要使用强制转换操作符来布尔.我有另一个名为line的类,我有一个声明如下的函数:

point intersect(const line& a, const line& b);

现在已经重载转换运算符为bool点我可以写两者:point p = intersect(a,b);if (intersect(a,b))因此得到任一的两条线的交叉点或检查,如果两条线相交.我也在其他地方使用它,但我相信这个例子足以显示强制转换运算符的用法.我对演员操作员的使用是否危险,如果是,你可以举一个例子,当效果不符合预期时?

编辑:由于juanchopanza的一个小小的补充:在这个项目中我只能使用c ++ 11,所以我无法使运算符显式化.

1 个回答
  • 这还不够好.既然你坚持使用C++ 03,那么如果你需要这样的东西就应该使用safe-bool习语(否则,explicit首选转换函数).

    另一种解决方案是返回boost:optional:

    boost::optional<point> intersect(const line& a, const line& b);
    

    我会采用这种方法(即使在C++ 11中),因为它在语义上看起来更好 - 并行线没有交叉点,因此返回值确实应该是可选的(或者可能是值).

    2023-02-12 18:09 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有