2011-10-31 17 views
1
struct Foo {}; 
struct Bar : Foo {}; 

Foo &foo = Bar(); // without const 

因爲它是寫在答案和註釋本question,我不能一個右值分配給一個參考。但是,我可以編譯此代碼(MSVC++ 2010)而不會出現錯誤或警告。這是我的編譯器的已知問題嗎?美孚&富=酒吧()是合法的或者是一個編譯器的問題

+3

事實上,您可以將臨時綁定到非常量引用是MSVC的已知「功能」。 – avakar

+1

酒吧之後paranteses的目的是什麼?不應該只是酒吧? –

+1

@MartinKristiansen no。爲什麼呢?那會做什麼? –

回答

1

您正在給引用分配一個臨時值。這是暫時的,因爲在這裏,Bar()就像一個函數,它返回一個Bar實例,該實例將在表達式範圍處(這裏是行尾)蒸發。這是非常危險和非法的,因爲取消引用foo會產生未定義的行爲。我不知道爲什麼MSVC++允許這個「功能」必須是一個固體錯誤。

有警告等級4(/ W4),你會得到

warning C4239: nonstandard extension used : 'initializing' : conversion from 'Bar' to 'Bar &' 

你應該總是用警戒線寫代碼4.
最後,@ KerrekSB的答案是比我好,你應該選擇他的如一個答案。

+0

那麼,答案是什麼?是否可以綁定到MSVC中的非常量引用作爲擴展?如果是,那麼如何禁用警告? –

+0

@KerrekSB由於它是一個4級警告(/ W4),它默認情況下對使用嚮導創建的項目是禁用的;默認設置是/ W3。恕我直言,這需要是一個較低級別的警告,因爲它可以導致不可移植的代碼。 – Praetorian

+0

@KerrekSB,答案是這樣的行爲是MSVC編譯器的非標準擴展。 Praetorian是對的:首先我用/ W3選項編譯 – Loom

10

臨時不會綁定到非常量引用。這就是語言設計的方式。

儘管原則上沒有技術障礙可以允許非恆定訪問臨時設備,但這幾乎總是設計不佳,而且往往會出現邏輯錯誤,因此標準不允許。如果你覺得需要修改一個臨時的,你應該重新考慮你爲什麼要這樣做。

+0

感謝您的回答(+1)。這很有用。但是,答案並不能解釋我的情況。 – Loom

+0

@ Loom:是的,我明白了。我想我隱約知道MSVC允許這個擴展......好吧,很高興知道:-)請記住,這不符合標準,因此不便攜,並且很可能是設計缺陷的標誌某處。 –

相關問題