string foo() { return "hello"; }int main() { //below should be illegal for binding a non-const (lvalue) reference to a rvalue string& tem = foo(); //below should be the correct one as only const reference can be bind to rvalue(most important const) const string& constTem = foo(); }GCC是產生編譯錯誤的好方法:std::string&從類型的臨時類型對類型的非常量引用進行無效的初始化std::stringVS2008還不錯,至少它給出了編譯警告:警告C4239:使用了非標準擴展名:'initializing':從轉換std::string為std::string &非常量引用只能綁定到左值這是有問題的一個-VS2010(SP1)可以很好地編譯,沒有任何錯誤或警告,為什么??!我知道VS2010中的右值引用可用于與右值綁定,但是我沒有使用&&,而是在演示代碼中,我只是在使用非常量左值引用!somone可以在這里幫助我解釋VS2010的行為嗎?這是一個錯誤!謝謝
3 回答

嚕嚕噠
TA貢獻1784條經驗 獲得超7個贊
編譯器將在啟用“禁用語言擴展”的情況下發出錯誤,并在/ W4處發出警告。但是,刪除此代碼將破壞以前的編譯代碼,Microsoft非常不愿意這樣做。這也是為什么他們不會修復其SFINAE支持的原因。

瀟瀟雨雨
TA貢獻1833條經驗 獲得超4個贊
幾年后以及許多版本的Visual Studio之后,我們仍然遇到這種“擴展”,這會引起意外和頭痛。嘆...
解決方法是將警告C4239變成錯誤。這樣可以防止MSVC編譯試圖將非常量左值引用綁定到臨時代碼的代碼,并給您帶來清晰的編譯器錯誤。只需將其添加/we4239到編譯器定義或cl命令行參數即可。
在Visual Studio中:項目屬性> C / C ++>所有選項>將特定警告視為錯誤> add 4239,并確保用分號分隔任何其他數字。
在CMake中:
if(MSVC)
add_definitions("/we4239")
endif()
這似乎比遠好工作禁用所有語言擴展用/Za,從而正式不推薦。在我的大型代碼庫中,添加代碼/Za導致Microsoft自己的winnt.h標頭導致1500多個編譯器錯誤。
- 3 回答
- 0 關注
- 1032 瀏覽
添加回答
舉報
0/150
提交
取消