tow*_*owi 5 c++ boolean istream implicit-conversion
我发现了一张C-ISH C++代码,并问自己(略学术)的问题,有什么隐式类型转换发生在这里,以在到达bool
该if
要求?
int val;
if( (std::cin >> val) == 0 )
...
Run Code Online (Sandbox Code Playgroud)
我到目前为止:
std::cin >> val
返回(参考)cin
,因此istream&
==
接收cin
和0
作为操作数,即istream
和int
我认为没有bool operator==(istream&, int)
可用的(也没有相应的成员函数istream
),所以是否涉及转换?
为了清楚起见,程序员的意图是检查输入是否成功,即应该写入if(!(std::cin >> val))
.
我认为没有可用
bool operator==(istream&, int)
的[...],那么是否涉及转换?
的确。有一个转换运算符,bool
true
如果没有发生错误则返回,false
否则返回。
根据 C++11 标准第 27.5.5.4/1 段:
Run Code Online (Sandbox Code Playgroud)explicit operator bool() const;
1返回:
!fail()
.
因此表达式 ( cin >> val
) 返回 a (对)的引用cin
,它是 的左操作数==
。正确的操作数是0
.
现在cin
可以转换为bool
,并且可以与 进行比较0
。换句话说,你的if
陈述相当于:
if (!(std::cin >> val))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)