为什么 C++ 11 在 ios 类中添加了运算符 bool
Why C++ 11 added operator bool to the ios classes
在 C++ 98 中,iOS 类中有一个公共函数定义为
operator void*() const;
在C++11 中向类中添加一个operator bool
,即
explicit operator bool() const;
通过阅读参考资料,我不清楚为什么operator bool
是必要的。
任何人都可以举一个例子,operator void*
会导致问题,而operator bool
工作正常?
在 C++98 中没有explicit
强制转换运算符,所以如果你有operator bool
,这意味着该对象可以用作bool
或任何可以从bool
(例如int
(强制转换的东西,这意味着您可能会意外地以您不希望或想要的方式使用您的对象(例如obj + 2
(。一些对象提供了对void*
的强制转换,这意味着可以在if
语句(非 null(中测试该对象,但不能传递给期望int
等的函数。
随着explicit
铸造运算符的引入,不再需要这样做,并且为了拥有一个可测试的对象,使用explicit operator bool
比使用operator void*
要好得多。
void*
仍然不能完美地替代隐式转换为bool
的缺点。它与转换为bool
存在相同的问题,主要是某些运算符允许类在应用操作之前转换为指针。
一个光荣的例子是,使用void*
运算符,您可以执行类似delete std::cin;
的操作,它可能会在没有警告的情况下构建,只是在运行时导致失败。这可能不是可能编写的代码,但如果可能的话,仍然希望防止它。
它归结为便利性,甚至是对库类新功能的一点"赞助"。
void*
转换是危险的,因为它可能应用于任何地方。好的,在实践中,由于它是一个指针,并且您可能会在数字压制中使用它(主要是在条件下(,因此它是安全的,但如果有人尝试在其他任何地方使用它,则可能会遇到麻烦。作为类设计人员,您希望尽可能避免它。
在 C++11 中,当您定义运算符explicit
时,您应该记住,对于我们关心的事情,explicit
部分在条件中被忽略。因此,您大大缩小了不必要的转化和不必要的结果的可能性。在条件之外,不会有转换,因此编译时错误将警告您潜在的类滥用(您仍然可以愿意允许适当的强制转换(。
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 运算符重载使用运算符+添加类模板
- 重载运算符与添加问题
- 运算符重载 += 添加新对象
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- C++ 尝试将>>运算符重载添加到模板
- 如何在自定义对象的<<运算符中添加自定义前缀
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 向日期运算符添加天数+
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- 重载加法运算符(使用函数向对象添加字符串)
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 赋值和添加运算符重载(2个表和int的串联)
- 实现矩阵类添加运算符重载奇怪的输出
- 复合赋值和添加运算符重载
- 当Type为unique_ptr时,为向量添加运算符[]
- 向 std::vector <T>添加运算符