2015-10-14 66 views
2

誰能告訴我爲什麼Visual Studio的C++編譯器不允許我這樣做:延長臨時對象的生命週期

string& s = "abc"; 

,但我能做到這一點:

string& s = string("abc"); 

當我試圖在linux上編譯第二個例子,g ++編譯器實際上拋出了一個錯誤,這正是我所期望的。快速谷歌搜索告訴我,在第二種情況下,臨時變量的生命週期擴展到引用的生命週期,但是再一次,第一個例子有什麼問題,爲什麼g ++會抱怨呢?

+3

'int i&'沒有意義。你有'int&i'嗎? – NathanOliver

+0

你只能用const引用來做到這一點。這與能夠對臨時引用const引用有關 - 如果這不存在,您將非常容易地引用懸掛引用。對於非const引用,它是無效的(因爲該參數不適用)。當然,你的編譯器可以自由運行。 – dascandy

+0

@NathanOliver你是對的,我非常抱歉,我最初是在字符串上測試它,並將它改爲整數,導致我的代碼和帖子出錯:/我編輯了這個問題。現在可能會更有意義。 – zedsdead

回答

4

有一個簡單的原因。 MSVC是越野車。知道的bug(他們更喜歡稱爲一個功能)允許編譯int i& = int(5);。它不應該。

正確的代碼:

int main() { 
    const int& i = 5; 
    const int& j = int(5); 
} 

正如你看到的,當你正確使用const引用,這兩個版本完全正常工作。至於雖然MSVC允許一個不正確的版本,並且不允許另一個版本 - 這只是一個錯誤,並且詢問'爲什麼錯誤以某種方式運行'是相當實際的。

但是,如果您必須對錯誤:)進行推理,允許int& i = 5稍後允許您編寫諸如i = 10;之類的內容,從而有效地改變整個程序中的5意味着什麼。

+0

'int i&= int(5);'不能用MSVS編譯 – NathanOliver

+0

我不認爲VC++團隊將它視爲「bug」..它是一個VC++擴展。與移動語義 - 它是冗餘的,但預C++ 11這是相當方便的優化 –

+0

@NathanOliver,嗯......有趣的。爲什麼OP說它編譯? :) – SergeyA