为什么C ++ 11将运算符bool添加到ios类

时间:2018-10-11 07:55:37

标签: c++ c++11 iostream

在C ++ 98中,定义为的ios类中有一个公共函数

operator void*() const;

在C ++ 11中将operator bool添加到该类中,即

explicit operator bool() const;

通过阅读reference,我不清楚为什么需要operator bool

有人能举例说明operator void*引起问题,而operator bool正常吗?

3 个答案:

答案 0 :(得分:5)

在C ++ 98中,没有explicit强制转换运算符,因此,如果您有operator bool,则意味着该对象可以用作bool或可以从中强制转换的任何对象bool(例如int)意味着您可能会意外使用对象(例如obj + 2)。一些对象提供了对void*的强制转换,这意味着可以在if语句中测试该对象(不为null),但不能传递给期望int等的函数。

通过引入explicit强制转换运算符,不再需要此操作,并且为了拥有 testable 对象,使用explicit operator booloperator void*更好。

答案 1 :(得分:3)

void*仍不能完美替代bool的隐式转换的缺点。遇到与转换为bool相同的问题,主要是某些运算符允许类在应用操作之前转换为指针。

一个光荣的例子是使用void*运算符,您可以执行类似delete std::cin;的操作,并且它可能会在没有警告的情况下进行构建,只会在运行时导致失败。可能不是编写 的代码,但仍然希望尽可能避免使用该代码。

答案 2 :(得分:1)

归结为方便,甚至归功于库类中一些新功能的“赞助”。

void*转换很危险,因为它可能会应用于任何地方。好的,实际上,由于它是一个指针,并且您可能会在数字表达式中使用它(主要是在条件下),所以它是安全的,但是如果有人尝试在其他任何地方使用它,则可能会引起麻烦。作为班级设计人员,您希望尽可能避免使用它。

在C ++ 11中,当您定义explicit运算符时,请记住,对于我们而言,explicit部分在某种情况下会被忽略。因此,您将极大地缩小发生不必要的转换以及产生不必要的结果的可能性。在条件之外,将不会进行任何转换,因此编译时错误将警告您可能会滥用该类(您仍然可以通过适当的强制转换来允许这样做)。