我发现了一段C-ish C ++代码并问自己(稍微有学术性)的问题,这里发生的隐式类型转换来到bool
if
需要?
int val;
if( (std::cin >> val) == 0 )
...
我到目前为止:
std::cin >> val
返回(参考)cin
,因此istream&
==
收到cin
和0
作为操作数,即istream
和int
我认为bool operator==(istream&, int)
没有istream
(if(!(std::cin >> val))
中也没有相应的成员函数),所以是否涉及转换??
为了清楚起见,程序员的意图是检查输入是否成功,即应该写成{{1}}。
答案 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;
}