我正在检查一个代码,并对此行感到困惑。
if( cout > 0 )
{
//some statements
}
请告诉我,我们是否可以使用cout
。它将如何运作?
答案 0 :(得分:5)
cout
是ostream
类型的变量(或由其衍生的某种类型)。 ostream
转换为void *
(pre-C ++ 11)或bool
(C ++ 11) - 这两个转换函数都检查文件流中的“错误状态” ,如果出现错误,则分别返回NULL
或false
。这两者将比较为零,因为零分别与NULL
和false
相同,因此语句变为(void *)cout > NULL
或(bool) cout > false
,如果{{1},则为真}不是cout
或NULL
(这意味着“没有错误”)。
[注意:使用false
时,与NULL
的指针比较可能无法正常工作,因为指针可能是“负数”,在这种情况下它不会大于p > NULL
- 我希望看到NULL
或if (cout != 0)
作为更安全/更好的选择]。
答案 1 :(得分:1)
std::cout
从explicit operator bool()
继承operator void*()
(C ++ 11)或std::basic_ios
(前C ++ 11)。这两者都能够与0
进行比较。但是,每个都有一个问题:
operator void*()
转换(感谢James Kanze在下面指出这一点)不能保证按预期工作。 0也将转换为void *
,然后,由于一个为空而一个不为,因此未指定比较(N3485§5.9/ 2)。
在此上下文中不会触发explicit operator bool()
转换,导致无法编译。但是,我不认为有任何主库实现在operator void*()
上使用它,即使它们应该。如果它是C ++ 11完成的话,Clang可能会为下一个版本做到这一点。