2017-01-05 45 views
-2
int returnByValue() 
{ 
    return 5; 
} 

int main() 
{ 
    const int &cref = returnByValue(); // case I 
    int &ref = returnByValue(); // case II -- compilation error 
    return 0; 
} 

引用變量是一個別名,也就是一個值的別名,那麼case I沒有錯誤,因爲returnByValue()返回的值是一個右值II有編譯錯誤?從一個右值初始化非const引用

+2

你的假設是錯誤的。引用不是變量的別名。它是*值*的別名。 –

+0

是的,一個值的別名(「已有變量的另一個名稱」表達了相同的信息)。 –

+0

對不起,這裏有什麼問題? –

回答

2

引用背後的基本思想是左值引用綁定到左值,右值引用綁定到右值;今後如此約束的引用是指它所綁定的價值。

但是,C++對此規則做了一個例外,並且允許左值引用也綁定到右值。這樣做的原因主要是方便:它允許使用const的左值引用參數的功能與臨時對象被調用,而不是隻用左值:

void do_something(const ExpensiveType&); // expects lvalue? 

ExpensiveType make_one(); 

// ... 

do_something(make_one()); // call with rvalue is OK, too! 

功能是特別喜歡的常量-ref參數是拷貝構造函數和拷貝分配操作員;如果那些只能在左值被調用,那麼你的代碼中需要更多的樣板。

這個例外只授予const引用,因爲具有這些參數的函數不會修改參數,只會「讀取」它們,如果您願意的話。相比之下,右值引用不允許綁定到可變的左值引用,因爲我們期望通過這樣的引用來修改值,並且幾乎可以肯定地是修改被立即銷燬的東西時的編程錯誤。 (但如果你真的需要,你可以寫一個用戶定義的左值到左值的轉換。)

相關問題