ostream& operator<< (ostream& os, const ReferenceTest& rt)
{
os << rt.counter; //In this scenario, rt has a public int called counter
}
私はこのコードでは、GCC 4.6.1を使用して問題なくコンパイルされたことを知って驚きました。それは私が予想した理由、すなわち私がostreamへの参照を返さないという理由でVisual Studio 2010を使用すると失敗します。しかし、2つのプラットフォーム用にコンパイルされたときのプログラムの出力は同じです(私はテスト出力を書きます)。
どの規格に準拠していますか?私はここで何かを見逃していますか?
-Derek
ありがとうございます。任意の(非voidの)関数から何かを返さなければ、コンパイル時のエラーとみなされませんか?私はこれが警告以上の理由を正当化すると考えていたでしょう。しかし、約同意した。 –
また、実行時の振る舞いは、巧妙なコンパイル(デビッドが示唆したように)、または偶然(K-バロ)の結果ですか?私のコードを実際に "修正"しようとすると、境界を越えて境界線を接しているようです... –
良いコンパイラは、問題を検出したときにコードを修正することを非常に難しくします。これは未定義の動作です。悪いコンパイラは何もしない、何も言わないかもしれない。不快なコンパイラは、 'degauss_hard_drive()'への呼び出しを挿入し、何も言わないかもしれません。定義されていない動作とは、コンパイラがコードを拒否したり、コードを拒否したり、コードを「修正」したり、コードを含むドライブを取り出したりすることです。定義されていない動作に対するコンパイラの応答については、何も問題ありません。 –