繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM