Linux下的g++和Windows下的Visual Studio,實現上函數匹配為什麼會不同?
02-04
在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 |