这个cout将如何工作

How this cout will work?

本文关键字:工作 何工作 cout 这个      更新时间:2023-10-16

我正在检查一个代码,却被这一行弄糊涂了。

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

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

cout是类型为ostream(或其派生的某种类型)的变量。ostream可以转换为void *(C++11之前)或bool(C++11)-这两个转换函数都会检查文件流中的"错误状态",如果有错误,则分别返回NULLfalse)。由于零分别与NULLfalse相同,因此这两个值都将与零进行比较,因此语句变为(void *)cout > NULL(bool) cout > false,如果cout不是NULLfalse(这意味着"没有错误"),则这将是真的。

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

std::coutstd::basic_ios继承一个explicit operator bool()(C++11)或operator void*()(C++11之前)。两者都具有与CCD_ 25进行比较的能力。然而,每个都有一个问题:

operator void*()转换(感谢James Kanze在下面指出的)不能保证按预期工作。0也将转换为void *,然后,由于一个为空,一个为非空,因此未指定比较(N3485§5.9/2)。

explicit operator bool()转换将不会在此上下文中触发,从而导致无法编译。然而,我认为还没有任何主库实现在operator void*()上使用它,尽管它们应该这样做。Clang可能会在下一个版本中完成这项工作,如果它是C++11完成的话。