这个cout将如何运作?

时间:2013-11-19 14:22:37

标签: c++ ostream

我正在检查一个代码,并对此行感到困惑。

if( cout > 0 )
{
    //some statements
}

请告诉我,我们是否可以使用cout。它将如何运作?

2 个答案:

答案 0 :(得分:5)

coutostream类型的变量(或由其衍生的某种类型)。 ostream转换为void *(pre-C ++ 11)或bool(C ++ 11) - 这两个转换函数都检查文件流中的“错误状态” ,如果出现错误,则分别返回NULLfalse。这两者将比较为零,因为零分别与NULLfalse相同,因此语句变为(void *)cout > NULL(bool) cout > false,如果{{1},则为真}不是coutNULL(这意味着“没有错误”)。

[注意:使用false时,与NULL的指针比较可能无法正常工作,因为指针可能是“负数”,在这种情况下它不会大于p > NULL - 我希望看到NULLif (cout != 0)作为更安全/更好的选择]。

答案 1 :(得分:1)

std::coutexplicit 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可能会为下一个版本做到这一点。