【发布时间】:2020-05-05 21:59:42
【问题描述】:
在C++ Primer 5th Ed.中,第 14 章讨论了转换运算符:
在标准的早期版本中,想要定义转换为 bool 的类面临一个问题:因为 bool 是算术类型,所以转换为 bool 的类类型对象可以在算术类型的任何上下文中使用预计。
这种转换可能会以令人惊讶的方式发生。特别是,如果 istream 转换为 bool,则以下代码将编译:
int i = 42; cin << i; // this code would be legal if the conversion to bool were not explicit!此程序尝试在输入流上使用输出运算符。没有为
istream定义<<,因此代码几乎肯定是错误的。但是,此代码可以使用布尔转换运算符将cin转换为bool。然后将得到的 bool 值提升为 int 并用作左移运算符的内置版本的左操作数。提升的布尔值(1 或 0)将左移 42 个位置。
输入流可以转换为表示流内部状态(成功或失败)的布尔值。我们曾经这样做:
while(std::cin >> str)...
那么为什么不编译呢?
int x = 0;
std::cin << x;
如果我使用显式强制转换,它会起作用:
(bool)cin << 5; // works although bad
【问题讨论】:
-
这能回答你的问题吗? stackoverflow.com/questions/39995573/…
-
你的推理几乎是正确的。您错过的唯一细节是
if (std::cin >> x)是允许的,即使转换被声明为如我上面链接的问答中所解释的那样明确 -
这就是为什么在早期转换不是太 bool 的原因。这是一种可以在 bool 上下文(不是确切的单词)中被打断的类型。因此,我们过去常常返回指向成员函数的指针。这些可以是 null 或指针,并且当放置在具有 true 或 false 的布尔上下文中时。即像
while (cin >> val)将返回一个流,然后将导致转换为指针之类的对象,该对象是整数类型,因此可用于强制循环退出。过去的日子很有趣。