2012-09-14 57 views
0

錯誤!爲什麼從int到double的轉換不起作用?

$ cat double.cc 
#include<iostream> 

int main() { 
    int i = 42; 
    double &r = i; 
} 
$ g++ double.cc 
double.cc: In function ‘int main()’: 
double.cc:5: error: invalid initialization of reference of type ‘double&’ 
from expression of type ‘int’ 
$ 

工程!

$ cat double.cc 
#include<iostream> 

int main() { 
    int i = 42; 
    const double &r = i; 
} 
$ g++ double.cc 
$ 

爲什麼我們在第一種情況下會出現錯誤?我知道這是討論here,但我不知道我明白爲什麼這不允許,而intconst double&被允許?

+0

爲什麼隨機驅動通過downvote沒有評論?這是一個很好的問題,尤其是在Moeb研究它並發現一個相關問題後(至少對於Moeb)不太滿意。 –

回答

4

當編寫

int i = 42; 
double const &r = i; 

i被隱式轉換爲雙,這導致在一個臨時值,或右值。非const引用不允許綁定到右值,因此r需要爲double const&以上才能工作。

6
int i = 42; 
double &r = i; 

這裏rdouble的引用,但i不是double,那麼如何才能r參考呢?這不可以。因此,它會在表達式i之外創建類型爲double的臨時對象。但再次,r這是非const引用,無法綁定到臨時對象。

但是,如果你把它const引用,那麼它會工作:

double const & r = i; 

注意const參考可以綁定到它創造出來的i臨時對象。

+0

但是,如何能'const double&'引用一個'int'? – Moeb

+0

@Moeb:編輯和解釋。 :-) – Nawaz

4

在C++中,您幾乎可以將引用視爲另一個變量的別名。它們必須匹配非cv限定類型,在這種情況下,類型是不同的。

它與const double&的原因是becaused編譯器創建一個臨時doublei的值的副本,並結合常量引用到暫時的。這是允許的,因爲綁定到臨時將臨時的生命延長到參考的生命週期。