【问题标题】:Why can std::cin not be implicitly converted to bool?为什么 std::cin 不能隐式转换为 bool?
【发布时间】: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 定义&lt;&lt;,因此代码几乎肯定是错误的。但是,此代码可以使用布尔转换运算符将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 &gt;&gt; x) 是允许的,即使转换被声明为如我上面链接的问答中所解释的那样明确
  • 这就是为什么在早期转换不是太 bool 的原因。这是一种可以在 bool 上下文(不是确切的单词)中被打断的类型。因此,我们过去常常返回指向成员函数的指针。这些可以是 null 或指针,并且当放置在具有 true 或 false 的布尔上下文中时。即像while (cin &gt;&gt; val) 将返回一个流,然后将导致转换为指针之类的对象,该对象是整数类型,因此可用于强制循环退出。过去的日子很有趣。

标签: c++ conversion-operator


【解决方案1】:

operator boolis declaredexplicit,因此不应隐式转换为布尔值:

bool b = std::cin; // Error

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

bool b {std::cin}; // OK, explicitly converting

所以当你尝试打电话时

std::cin << 5;

它不会编译,因为您期望进行隐式转换,而该类只允许显式转换。这是什么作品:

bool(std::cin) << 5;

现在,为什么while(std::cin &gt;&gt; x) 会编译?标准保证在这种情况下显式转换为bool。请参阅问题 cmets 中链接的great post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多