2011-10-27 56 views
2

可能重複:
How come a non-const reference cannot bind to a temporary object?傳輸參數爲const參考與正常參考

有這樣的代碼:

void fun_ref(int& par){} 

void fun_const_ref(const int& par){} 

int main(){ 

    //fun_ref(2); error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’ 
    fun_const_ref(2); 

    char var = 3; 
    //fun_ref(var); error: invalid initialization of reference of type ‘int&’ from expression of type ‘char’ 
    fun_const_ref(var); 
    return 0; 
} 

爲什麼是可以通過右值和不同數據類型比用於常量引用的函數參數的類型,但對於非const而言是不可能的螞蟻參考?

回答

0

編譯器可以通過隱式轉換創建函數參數類型的臨時值,並將其作爲const引用傳遞。這不適用於引用類型,因爲臨時文件不能作爲非常量引用傳遞。

編輯:由於標準是這樣說的,所以不允許非const引用臨時對象。這背後的原因是獲取非const引用的函數將改變其參數(否則您可能會使參考爲const),並且當臨時超出範圍時,這些更改將會丟失。

+1

對,那,問題是*爲什麼*不能作爲非const引用傳遞臨時對象? –

1

在第一種情況下,2是臨時的,因此它只能綁定到const引用;這就是爲什麼你不能撥打fun_ref

在第二種情況下,varchar所以它不能被綁定到一個int&。但是,有可能將var轉換爲臨時int,其可以與上述的const int&相綁定;那個由於隱含的覆蓋而工作。

2

當參數是一個常量引用,並且傳遞的參數不是該類型的,但存在對該類型的隱式轉換時,實現將暫時存儲該值並使用臨時參數。所以const版本不參考char var,而是參考int __temp