我曾在一個示例應用程序下面的代碼:重載運算符<<返回的ostream&
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
感謝您的回覆。不會從任何(無效)函數返回某些東西的資格作爲編譯時錯誤?我會認爲這不僅僅是一個警告。同意 - 但是。 –
另外,運行時行爲是巧妙編譯(如David建議的)還是巧合(K-ballo)的結果?如果它實際上試圖「修復」我的代碼,它似乎是越界越界...... –
當檢測到問題時,一個好的編譯器會很努力地修復你的代碼。然而這是未定義的行爲。一個糟糕的編譯器可能什麼也不做,什麼都不說一個討厭的編譯器可能會向'degauss_hard_drive()'插入一個調用,並且什麼也不說。未定義的行爲意味着編譯器可以對你很好,並拒絕你的代碼,對你很好,並「修復」你的代碼,對你有意義並彈出包含代碼的驅動器。當涉及到編譯器對未定義行爲的響應時,任何事情都可以。 –