我在示例应用程序中有以下代码:
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
答案 0 :(得分:2)
编译时是否启用了警告?我用g ++获得了warning: control reaches end of non-void function
。
您当然不希望编译器停止代码中的第一个错误。你希望它能够在一个膨胀的泡沫中捕获尽可能多的东西。为此,编译器必须修补您的错误代码,以便它可以按下。在这种情况下,补丁很明显:返回作为参数提供的流。
永远不要相信编译器免费提供的那些“修复”。它们不是免费的。修改你的代码。
并且始终在启用警告的情况下进行编译。
答案 1 :(得分:1)
缺少退货声明以外的其他内容?缺少它是未定义的行为(我甚至认为这对于这种简单的情况来说是编译时错误)。可能会发生os << rt.counter
表达式的返回值恰好位于预期整个operator<<
的返回值的同一位置,这使得它只是偶然的工作。