struct Foo {};
struct Bar : Foo {};
Foo &foo = Bar(); // without const
因爲它是寫在答案和註釋本question,我不能一個右值分配給一個參考。但是,我可以編譯此代碼(MSVC++ 2010)而不會出現錯誤或警告。這是我的編譯器的已知問題嗎?美孚&富=酒吧()是合法的或者是一個編譯器的問題
struct Foo {};
struct Bar : Foo {};
Foo &foo = Bar(); // without const
因爲它是寫在答案和註釋本question,我不能一個右值分配給一個參考。但是,我可以編譯此代碼(MSVC++ 2010)而不會出現錯誤或警告。這是我的編譯器的已知問題嗎?美孚&富=酒吧()是合法的或者是一個編譯器的問題
您正在給引用分配一個臨時值。這是暫時的,因爲在這裏,Bar()
就像一個函數,它返回一個Bar
實例,該實例將在表達式範圍處(這裏是行尾)蒸發。這是非常危險和非法的,因爲取消引用foo
會產生未定義的行爲。我不知道爲什麼MSVC++允許這個「功能」必須是一個固體錯誤。
有警告等級4(/ W4),你會得到
warning C4239: nonstandard extension used : 'initializing' : conversion from 'Bar' to 'Bar &'
你應該總是用警戒線寫代碼4.
最後,@ KerrekSB的答案是比我好,你應該選擇他的如一個答案。
那麼,答案是什麼?是否可以綁定到MSVC中的非常量引用作爲擴展?如果是,那麼如何禁用警告? –
@KerrekSB由於它是一個4級警告(/ W4),它默認情況下對使用嚮導創建的項目是禁用的;默認設置是/ W3。恕我直言,這需要是一個較低級別的警告,因爲它可以導致不可移植的代碼。 – Praetorian
@KerrekSB,答案是這樣的行爲是MSVC編譯器的非標準擴展。 Praetorian是對的:首先我用/ W3選項編譯 – Loom
臨時不會綁定到非常量引用。這就是語言設計的方式。
儘管原則上沒有技術障礙可以允許非恆定訪問臨時設備,但這幾乎總是設計不佳,而且往往會出現邏輯錯誤,因此標準不允許。如果你覺得需要修改一個臨時的,你應該重新考慮你爲什麼要這樣做。
感謝您的回答(+1)。這很有用。但是,答案並不能解釋我的情況。 – Loom
@ Loom:是的,我明白了。我想我隱約知道MSVC允許這個擴展......好吧,很高興知道:-)請記住,這不符合標準,因此不便攜,並且很可能是設計缺陷的標誌某處。 –
事實上,您可以將臨時綁定到非常量引用是MSVC的已知「功能」。 – avakar
酒吧之後paranteses的目的是什麼?不應該只是酒吧? –
@MartinKristiansen no。爲什麼呢?那會做什麼? –