为什么 std::cin 不能隐式转换为 bool?

Mae*_*tro 4 c++ conversion-operator

C++ Primer 第 5 版中。, 第 14 章讨论转换运算符:

在该标准的早期版本中,想要定义到 bool 的转换的类面临一个问题:因为 bool 是一种算术类型,转换为 bool 的类类型对象可以在任何需要算术类型的上下文中使用。

这种转换可能以令人惊讶的方式发生。特别是,如果 istream 转换为 bool,则以下代码将编译:

int i = 42;
cin << i; // this code would be legal if the conversion to bool were not explicit!
Run Code Online (Sandbox Code Playgroud)

该程序尝试在输入流上使用输出运算符。没有<<定义 for istream,所以代码几乎肯定是错误的。然而,这个代码可以使用布尔转换操作符转换cinbool。然后将生成的 bool 值提升为 int 并用作左移运算符的内置版本的左侧操作数。提升的布尔值(1 或 0)将左移 42 个位置。

输入流可以转换为表示流内部状态(成功或失败)的布尔值。我们曾经这样做:

while(std::cin >> str)...
Run Code Online (Sandbox Code Playgroud)

那么为什么不应该编译呢?

int x = 0;
std::cin << x;
Run Code Online (Sandbox Code Playgroud)

如果我使用显式转换,它会起作用:

(bool)cin << 5; // works although bad
Run Code Online (Sandbox Code Playgroud)

Joe*_*lho 5

operator bool 声明 explicit,所以它不应该被隐式转换为布尔:

bool b = std::cin; // Error
Run Code Online (Sandbox Code Playgroud)

因此,您需要显式转换cin为布尔值才能使其工作:

bool b {std::cin}; // OK, explicitly converting
Run Code Online (Sandbox Code Playgroud)

所以当你尝试打电话时

std::cin << 5;
Run Code Online (Sandbox Code Playgroud)

它不会编译,因为您期望隐式转换,而该类只允许显式转换。这是有效的:

bool(std::cin) << 5;
Run Code Online (Sandbox Code Playgroud)

现在,为什么要while(std::cin >> x)编译?标准保证bool在这种情况下显式转换为。请参阅相关问题评论中链接的精彩帖子