2016-03-20 107 views
3

爲什麼在第二行編譯時第一行不能編譯?C++ - 類類型的構造函數返回一個左值?

float& t = float(10); // initial value of reference to non - const must be an lvalue 
string& w = string("gg"); 

這是否意味着字符串構造函數返回一個左值?

+0

g ++ 4.8.2對於*這些行中的每一行,給出了「錯誤:類型爲...的非常量引用的無效初始化」。 –

+0

這是一個很好的問題,這讓我想知道爲什麼總會有人在這裏進行投票/投票表決問題(甚至沒有留下解釋原因的評論)。這裏的一些用戶應該被正當地剝奪這種特權。 –

+1

我想第二行編譯是因爲你使用的是MSVC,而你沒有用/ W4編譯。如果你用/ W4編譯,你應該看到類似「警告C4239:使用非標準擴展」。 – cpplearner

回答

3

構造函數的定義沒有返回值。你試圖執行的是引用一個不允許的臨時值。

好文章,瞭解lvaluervalue參考文獻是C++ Rvalue References Explained

+0

「您嘗試執行的操作是引用不允許的臨時值。」是的,我同意這一說法。我只是困惑爲什麼第二行編譯。 cpplearner是對的。我正在使用MSVC。也許MSVC有一些特殊的屬性? – Eugene

+0

這很奇怪,因爲在使用gcc和clang的情況下,我都得到相同的錯誤:'不能從右值初始化非const引用。 – karastojko

2

你所得到的是不是你期待什麼:

float& ref = float(10); 

是什麼發生在這裏? float(10)創建一個臨時浮動(不綁定任何東西),因此它是一個右值。因此你不能將它綁定到一個非const的左值引用。

float const & cref = float(10); // OK! 

涉及到的機制與std::string相同。我很疑惑你沒有在字符串示例上得到編譯器錯誤(我使用gcc 5.3.0)

請注意,這與所謂的「構造函數返回值」無關,因爲構造函數沒有這樣的事情。

+0

感謝您的回答。我認爲這是因爲我正在使用MSVC。 – Eugene

相關問題