为什么 C++ 11 将 operator bool 添加到 ios 类

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

在C++ 98中,ios中有一个public函数classes定义为

operator void*() const;

在C++11中对class添加了一个operator bool,即

explicit operator bool() const;

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

谁能举个例子,其中 operator void* 导致问题,而 operator bool 工作正常?

在 C++98 中没有 explicit 转换运算符,所以如果你有一个 operator bool 这意味着该对象可以用作 bool 或任何可以是从 bool 转换(例如 int)这意味着您可能会意外地以您不希望或不想要的方式使用您的对象(例如 obj + 2)。某些对象提供了对 void* 的转换,这意味着该对象可以在 if 语句(非空)中进行测试,但不能传递给期望 int 等的函数

随着 explicit 转换运算符的引入,这不再需要,为了拥有一个 可测试的 对象,使用 explicit operator booloperator void*

它归结为便利性,甚至 classes.

库中的一些 "sponsorship" 新功能

void* 转换很危险,因为它可能适用于任何地方。好吧,在实践中,因为它是一个指针,你可能会在数字表达式(主要是在条件)中使用它,它是安全的,但如果有人试图在其他任何地方使用它,就有可能出现麻烦。作为一名 class 设计师,您希望尽可能避免它。

在C++11中,当你定义explicit运算符时,你应该记住,对于我们来说,explicit部分在条件中被忽略。因此,您大大减少了不需要的转换和不需要的结果的可能性。在条件之外,不会有任何转换,因此编译时错误会警告您可能滥用 class(您仍然可以通过适当的强制转换允许)。

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

一个很好的例子是,使用 void* 运算符,你可以做类似 delete std::cin; 的事情,它可能会在没有警告的情况下构建,只会在 运行- 处导致失败时间。这可能不是 可能 编写的代码,但如果可能的话,仍然希望避免它。