istream会发生什么隐式转换?

tow*_*owi 5 c++ boolean istream implicit-conversion

我发现了一张C-ISH C++代码,并问自己(略学术)的问题,有什么隐式类型转换发生在这里,以在到达boolif要求?

int val;
if( (std::cin >> val) == 0 )
    ...
Run Code Online (Sandbox Code Playgroud)

我到目前为止:

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

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


为了清楚起见,程序员的意图是检查输入是否成功,即应该写入if(!(std::cin >> val)).

And*_*owl 1

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

的确。有一个转换运算符,booltrue如果没有发生错误则返回,false否则返回。

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

explicit operator bool() const;
Run Code Online (Sandbox Code Playgroud)

1返回!fail().

因此表达式 ( cin >> val) 返回 a (对)的引用cin,它是 的左操作数==。正确的操作数是0.

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

if (!(std::cin >> val))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)