使用cout输出cerr

8

我发现了一段基本上执行以下操作的代码:

#include <iostream>

using namespace std;
int main()
{
    cout << cerr << " Hi.";

    return 0;
}

输出:

0x601088 Hi.

首先,为什么有人会使用“cout << cerr”,这没有意义。 其次,上面输出的含义是什么?
值得一提的是,在我的电脑上,上述代码可以编译并执行而不出现错误。
然而,在一个不同的机器上(服务器ssh连接),运行相同版本的gcc 5.4.0的一个更复杂的代码(与上面的代码做同样的事情)在进行make时产生了以下错误(为了清晰起见缩短了错误信息)。
error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::ostream {aka std::basic_ostream<char>}’)
     cout << cerr << "DB: Field " + e.table + "[" + e.index + "]." + e.field

你对此有何想法?

Cerr是用于警告输出流的。如果您重载左移运算符,就可以完成它。 - Jake Freeman
很可能是打错了。有两个东西被发送到 cout。第一件事在打印时并不是非常有意义的。 - Drew Dormann
你应该使用 g++ 而不是 gcc 来编译 C++ 程序,对吗? - N. Ivanov
g++和gcc版本相同。 - miro_x
1
@miro_x GCC 5.4.0默认使用标志“-std=c++03”进行编译,这意味着它使用ISO C++03。 - Francisco Gallego Salido
显示剩余2条评论
1个回答

13

在C++11之前,std::basic_ios提供了一个隐式转换为void*。这段代码在C++11或更高版本中无法编译。您基本上拥有这个,在旧版本的gcc中编译:

#include <iostream>
int main()
{
    void * x = std::cerr;
    std::cout << x << " Hi.";

    return 0;
}

非常感谢,太好了。我想它不再受支持了,因为没有理由使用cout << cerr,我是正确的吗? - miro_x
@miro_x 是的,从一开始就是错误的 cout << cerr,只是碰巧编译通过了,当使用它时输出了指针的无意义值,然后才输出实际的错误信息。 - Jabberwocky
@miro_x 这样做的唯一原因是知道流是否处于失败状态。 返回指针的实际值除检查 nullptr 外毫无意义。 如果 fail() 返回 true,则转换返回 nullptr,否则返回非 NULL 指针。 无论哪种情况,只需将流转换为 bool 或直接调用 fail() - François Andrieux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接