2012-09-14 54 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的值的副本,并结合常量引用到暂时的。这是允许的,因为绑定到临时将临时的生命延长到参考的生命周期。