istream会发生什么隐式转换?

时间:2013-06-09 13:44:20

标签: c++ boolean implicit-conversion istream

我发现了一段C-ish C ++代码并问自己(稍微有学术性)的问题,这里发生的隐式类型转换来到bool if需要?

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

我到目前为止:

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

我认为bool operator==(istream&, int)没有istreamif(!(std::cin >> val))中也没有相应的成员函数),所以是否涉及转换?


为了清楚起见,程序员的意图是检查输入是否成功,即应该写成{{1}}。

2 个答案:

答案 0 :(得分:1)

  

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

事实上。如果没有错误,则conversion operator to bool会返回true,否则会返回false

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

explicit operator bool() const;
     

1 返回!fail()

因此表达式(cin >> val)会返回一个(引用)cin,它是==的左操作数。右操作数为0

现在cin可以转换为bool,这样就可以与0进行比较。换句话说,您的if语句相当于:

if (!(std::cin >> val))
{
    // ...
}

答案 1 :(得分:0)

我认为编写的代码格式不正确。

如果您在没有优化和输出程序集的情况下进行编译,则可以在此处查看调用哪个运算符或转换函数:

#include <istream>

void f(std::istream &is)
{
    is==0;
}