Linux下的g++和Windows下的Visual Studio,實現上函數匹配為什麼會不同?

在visual·studio 2015寫的一個測試題,放在Linux下編譯。發現這個問題.

在VS上檢查語法是正確的,也能編譯成功,正常運行。

有趣的是,我創建一個對象就通過了。

這個問題讓我很迷惑。

T tmp();

return f1(tmp);

return f1(T());

在實現上到底如何完成的?有什麼區別?為什麼T() 臨時對象作為參數不能匹配到T ?編譯器的不同行為如何避免?


T 是左值引用類型,T() 是個右值。右值不應該匹配左值引用。

解決方法:將 coor 參數的類型改為 const coordinate 或者 coordinate。


你臨時構造的對象不能綁定到非常量左值引用

要麼綁定到右值引用,要麼綁定到常量左值引用,兩者都可以給臨時對象續命


更好的方法是,一看你的coordinate就只是一個微小的POD,那參數就不要用引用。


vc++的左值引用是個擴展,不在標準里的,編譯的時候應當會有個warning


引用對象加個const ,你vs應該是低版本吧,我用2015記得是編譯不過的,養成引用傳遞參數的時候如果不需要修改這個參數就加const的習慣。

你函數調用的時候創建的那個對象是不能修改的是個左值。


推薦閱讀:

GCC 下 C++ 中 new int[] 內存的額外信息在哪裡?
利用C++ template,請問我該如何設計這個向量類(Vector)?
C/C++ 中怎樣優雅的寫多判斷 if 語句?
蘋果系統為什麼用Objective-C,而不用C++?
C++ std::set 的實現中對於iterator的這個強制轉換是如何進行的?

TAG:C | MicrosoftVisualStudio | g |