为什么从int转换为double& amp;不行?

时间:2012-09-14 16:05:55

标签: c++ reference

错误!

$ 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&

3 个答案:

答案 0 :(得分:6)

int i = 42;
double &r = i;

此处r是对double的引用,但i不是double,那么r如何引用它?这不可以。因此,它从表达式double中创建了i类型的临时对象。但同样,r 非const 引用,无法绑定到临时对象。

但是,如果你使它成为const引用,那么它将起作用:

double const & r = i;

请注意,const引用可以绑定到由i创建的临时对象。

答案 1 :(得分:4)

在C ++中,您几乎可以将引用视为另一个变量的别名。它们必须匹配非cv限定类型,在这种情况下类型是不同的。

它与const double&一起使用的原因是编译器创建了一个带有double值副本的临时i,并将const引用绑定到该临时值。这是允许的,因为绑定到临时将临时的生命延长到引用的生命周期。

答案 2 :(得分:4)

写作时

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

i被隐式转换为double,从而产生临时值,或 rvalue 。非const引用不允许绑定到右值,因此r需要double const&才能使上述工作正常。