5

我找到了一段 C-ish C++ 代码并问自己一个(有点学术性的)问题,这里发生了哪些隐式类型转换才能达到bool要求if

int val;
if( (std::cin >> val) == 0 )
    ...

我做到了这一点:

  • std::cin >> val返回 (a ref to) cin,因此istream&
  • 因此==接收cin0作为操作数,即istreamint

我认为没有bool operator==(istream&, int)可用的(也没有相应的成员函数istream),那么是否涉及转换


需要明确的是,程序员的意图是检查输入是否成功,即是否应该写入if(!(std::cin >> val)).

4

2 回答 2

1

我认为没有bool operator==(istream&, int)可用的 [...] 那么是否涉及转换?

确实。如果没有发生错误,则返回一个转换运算符bool,否则返回。truefalse

根据 C++11 标准的第 27.5.5.4/1 段:

explicit operator bool() const;

1返回!fail()

所以表达式 ( cin >> val) 会返回一个 (reference to) cin,它是 的左操作数==。右操作数是0

现在cin可以转换为bool,并且允许与 进行比较0。换句话说,您的if陈述相当于:

if (!(std::cin >> val))
{
    // ...
}
于 2013-06-09T13:46:09.500 回答
0

我相信编写的代码格式不正确。

如果您在没有优化和输出汇编的情况下进行编译,您可能能够看到此处调用了哪个运算符或转换函数:

#include <istream>

void f(std::istream &is)
{
    is==0;
}
于 2013-06-16T16:37:09.270 回答