[英]Why can std::cin not be implicitly converted to bool?
在C++ Primer 第 5 版中。 , 第 14 章讨论转换运算符:
在标准的早期版本中,想要定义转换为 bool 的类面临一个问题:因为 bool 是一种算术类型,所以转换为 bool 的类类型 object 可以在任何需要算术类型的上下文中使用。
这种转换可能以令人惊讶的方式发生。 特别是,如果 istream 转换为 bool,则以下代码将编译:
int i = 42; cin << i; // this code would be legal if the conversion to bool were not explicit!
此程序尝试在输入 stream 上使用 output 运算符。 没有为
istream
定义<<
,因此代码几乎肯定是错误的。 但是,此代码可以使用 bool 转换运算符将cin
转换为bool
。 然后将生成的 bool 值提升为 int 并用作左移运算符的内置版本的左操作数。 提升的布尔值(1 或 0)将左移 42 个位置。
输入流可以转换为代表 stream 内部状态(成功或失败)的布尔值。 我们曾经这样做:
while(std::cin >> str)...
那么为什么不应该编译呢?
int x = 0;
std::cin << x;
如果我使用显式强制转换,它会起作用:
(bool)cin << 5; // works although bad
operator bool
被声明为explicit
,因此不应将其隐式转换为 boolean:
bool b = std::cin; // Error
因此,您需要将cin
显式转换为 boolean 才能使其工作:
bool b {std::cin}; // OK, explicitly converting
所以当你尝试打电话时
std::cin << 5;
它不会编译,因为您期望进行隐式转换,而 class 只允许显式转换。 这是有效的:
bool(std::cin) << 5;
现在,为什么while(std::cin >> x)
编译? 该标准保证在这种情况下显式转换为bool
。 请参阅有关该问题的评论中链接的精彩帖子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.