2014-10-16 37 views
7

爲什麼此代碼格式良好?我沒有傳遞函數的參考:將整數傳遞給函數以供參考

void function(const int& ref) { 

} 

int main() 
{ 
    function(1); 
} 
+5

函數參數簽名中的'const'允許您這樣做。嘗試省略它,你會得到一個錯誤。 – 2014-10-16 21:13:13

回答

2

編譯器可以從常量創建一個臨時對象,臨時對象允許綁定到常量引用。如果引用不是const,這將不被允許。

+0

可憐的編譯器並沒有要求成爲本次討論的一部分。它只是按照語言規則告訴它:-( – 2014-10-16 21:20:03

+0

@KerrekSB那麼,編譯器可以創建一個臨時表,並將其綁定到一個非const引用,但它不會那樣做,因爲語言規則告訴它不要這樣做。 ;) – 2014-10-16 21:39:30

6

常量左值引用可以綁定到右值。與您的文字1一樣,Rvalues沒有持久性別名,因此如果要修改它,則無法觀察其效果,但如果您承諾不對其進行修改(即通過訪問常量參考文獻),您仍然可以擁有完全合理的代碼,這就是允許此綁定的原因。

(您也可以綁定右值到(可變)右值引用void function(int &&)在這種情況下,右值引用變成值的(唯一的)別名。)也是

注意如果沒有這個規則,它會不可能從返回prvalues的函數初始化變量,或者使用複製初始化:

struct T { T(int); }; 

T f(); 

T x = 1;  // === "T x = T(1);", copy constructor wants to bind to prvalue 
T x = f(); // ditto 
T x((f())); // ditto 
+0

我沒有得到這最後的「複製初始化」鏈接與「能夠綁定一個常數左值引用rvalues」。我相信T(int)應該是T(const int&) – Dean 2014-10-16 22:02:27

+0

@ user3834459:不,int與你的int沒有任何關係。在這個例子中'T'值是prvalue。 – 2014-10-16 22:04:08

+0

我只是不明白如何複製初始化與我剛剛帶來的問題有關 – Dean 2014-10-16 22:09:24