重载运算符<<返回ostream&

时间:2011-10-25 01:38:35

标签: c++ pass-by-reference

我在示例应用程序中有以下代码:

ostream& operator<< (ostream& os, const ReferenceTest& rt)
{
    os << rt.counter;  //In this scenario, rt has a public int called counter
}

我很惊讶地发现使用GCC 4.6.1编译的代码没有问题。因为我预期的原因使用Visual Studio 2010时失败,即我没有返回对ostream的引用。但是,为两个平台编译时程序的输出是相同的(我有一个简单的main()写入测试输出)。

哪个符合标准?我错过了一些明显的东西吗?

-Derek

2 个答案:

答案 0 :(得分:2)

编译时是否启用了警告?我用g ++获得了warning: control reaches end of non-void function

您当然不希望编译器停止代码中的第一个错误。你希望它能够在一个膨胀的泡沫中捕获尽可能多的东西。为此,编译器必须修补您的错误代码,以便它可以按下。在这种情况下,补丁很明显:返回作为参数提供的流。

永远不要相信编译器免费提供的那些“修复”。它们不是免费的。修改你的代码。

并且始终在启用警告的情况下进行编译。

答案 1 :(得分:1)

缺少退货声明以外的其他内容?缺少它是未定义的行为(我甚至认为这对于这种简单的情况来说是编译时错误)。可能会发生os << rt.counter表达式的返回值恰好位于预期整个operator<<的返回值的同一位置,这使得它只是偶然的工作。