为什么这个与bool的比较不适用于istream?

时间:2013-11-02 23:07:22

标签: c++ boolean istream

我对如何/为什么可以在条件语中使用istream有一个脆弱的理解。我读过这个问题:( Why istream object can be used as a bool expression?)。

我不明白为什么这个编译没有错误......

while (cin >> n) {
    // things and stuff
}

...虽然无法编译(消息error: invalid operands to binary expression ('int' and '__istream_type' (aka 'basic_istream<char, std::char_traits<char> >'))

while (true == (cin >> n)) {
    // things and stuff
}

2 个答案:

答案 0 :(得分:2)

因为cin的隐式转换运算符是

operator void*() const { ... }

并且它可以评估为零,因此您可以将其检查为零

while (cin >> x) {}

bool的转化运算符声明为explicit,因此您的表达式不会调用它:

explicit operator bool(){ ... }

所以,你需要一个明确的演员:

if (true == static_cast<bool>(cin >> a))
{
}

答案 1 :(得分:0)

cin >> n会返回istream&。由于结果用于比较,因此编译器会搜索无法找到的operator==(bool, istream)。因此,您会收到一条错误消息。