在C ++ 98中,定义为的ios类中有一个公共函数
operator void*() const;
在C ++ 11中将operator bool
添加到该类中,即
explicit operator bool() const;
通过阅读reference,我不清楚为什么需要operator bool
。
有人能举例说明operator void*
引起问题,而operator bool
正常吗?
答案 0 :(得分:5)
在C ++ 98中,没有explicit
强制转换运算符,因此,如果您有operator bool
,则意味着该对象可以用作bool
或可以从中强制转换的任何对象bool
(例如int
)意味着您可能会意外使用对象(例如obj + 2
)。一些对象提供了对void*
的强制转换,这意味着可以在if
语句中测试该对象(不为null),但不能传递给期望int
等的函数。
通过引入explicit
强制转换运算符,不再需要此操作,并且为了拥有 testable 对象,使用explicit operator bool
比operator void*
更好。
答案 1 :(得分:3)
void*
仍不能完美替代bool
的隐式转换的缺点。遇到与转换为bool
相同的问题,主要是某些运算符允许类在应用操作之前转换为指针。
一个光荣的例子是使用void*
运算符,您可以执行类似delete std::cin;
的操作,并且它可能会在没有警告的情况下进行构建,只会在运行时导致失败。可能不是编写 的代码,但仍然希望尽可能避免使用该代码。
答案 2 :(得分:1)
归结为方便,甚至归功于库类中一些新功能的“赞助”。
void*
转换很危险,因为它可能会应用于任何地方。好的,实际上,由于它是一个指针,并且您可能会在数字表达式中使用它(主要是在条件下),所以它是安全的,但是如果有人尝试在其他任何地方使用它,则可能会引起麻烦。作为班级设计人员,您希望尽可能避免使用它。
在C ++ 11中,当您定义explicit
运算符时,请记住,对于我们而言,explicit
部分在某种情况下会被忽略。因此,您将极大地缩小发生不必要的转换以及产生不必要的结果的可能性。在条件之外,将不会进行任何转换,因此编译时错误将警告您可能会滥用该类(您仍然可以通过适当的强制转换来允许这样做)。