为什么 C++ 11 在 ios 类中添加了运算符 bool

Why C++ 11 added operator bool to the ios classes

本文关键字:添加 运算符 bool C++ ios 为什么      更新时间:2023-10-16

在 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部分在条件中被忽略。因此,您大大缩小了不必要的转化和不必要的结果的可能性。在条件之外,不会有转换,因此编译时错误将警告您潜在的类滥用(您仍然可以愿意允许适当的强制转换(。