亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一個VS2010錯誤?允許將非常量引用綁定到右值而沒有警告?

一個VS2010錯誤?允許將非常量引用綁定到右值而沒有警告?

C++
呼如林 2020-02-01 17:19:40
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貢獻1712條經驗 獲得超3個贊

這是VS編譯器的已知問題/功能。他們一直允許這樣做,并且似乎沒有任何推動力去刪除該擴展名


查看完整回答
反對 回復 2020-02-01
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

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


查看完整回答
反對 回復 2020-02-01
?
瀟瀟雨雨

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多個編譯器錯誤。


查看完整回答
反對 回復 2020-02-01
  • 3 回答
  • 0 關注
  • 1032 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號