爲什麼在第二行編譯時第一行不能編譯?C++ - 類類型的構造函數返回一個左值?
float& t = float(10); // initial value of reference to non - const must be an lvalue
string& w = string("gg");
這是否意味着字符串構造函數返回一個左值?
爲什麼在第二行編譯時第一行不能編譯?C++ - 類類型的構造函數返回一個左值?
float& t = float(10); // initial value of reference to non - const must be an lvalue
string& w = string("gg");
這是否意味着字符串構造函數返回一個左值?
構造函數的定義沒有返回值。你試圖執行的是引用一個不允許的臨時值。
好文章,瞭解lvalue
和rvalue
參考文獻是C++ Rvalue References Explained。
「您嘗試執行的操作是引用不允許的臨時值。」是的,我同意這一說法。我只是困惑爲什麼第二行編譯。 cpplearner是對的。我正在使用MSVC。也許MSVC有一些特殊的屬性? – Eugene
這很奇怪,因爲在使用gcc和clang的情況下,我都得到相同的錯誤:'不能從右值初始化非const引用。 – karastojko
你所得到的是不是你期待什麼:
float& ref = float(10);
是什麼發生在這裏? float(10)
創建一個臨時浮動(不綁定任何東西),因此它是一個右值。因此你不能將它綁定到一個非const的左值引用。
float const & cref = float(10); // OK!
涉及到的機制與std::string
相同。我很疑惑你沒有在字符串示例上得到編譯器錯誤(我使用gcc 5.3.0)
請注意,這與所謂的「構造函數返回值」無關,因爲構造函數沒有這樣的事情。
感謝您的回答。我認爲這是因爲我正在使用MSVC。 – Eugene
g ++ 4.8.2對於*這些行中的每一行,給出了「錯誤:類型爲...的非常量引用的無效初始化」。 –
這是一個很好的問題,這讓我想知道爲什麼總會有人在這裏進行投票/投票表決問題(甚至沒有留下解釋原因的評論)。這裏的一些用戶應該被正當地剝奪這種特權。 –
我想第二行編譯是因爲你使用的是MSVC,而你沒有用/ W4編譯。如果你用/ W4編譯,你應該看到類似「警告C4239:使用非標準擴展」。 – cpplearner