0

错误!

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

为什么我们会在第一种情况下得到错误?我知道这是在这里讨论的,但我不确定我是否理解为什么不允许这样做,而int允许const double&

4

3 回答 3

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

这里r是一个引用double,但i不是一个double,那怎么能r引用呢?这不可以。所以它double从表达式中创建了一个类型的临时对象i。但同样,r它是非常量引用,不能绑定到临时对象。

但是,如果您将其设为 const 引用,那么它将起作用:

double const & r = i;

请注意,const引用可以绑定到由i.

于 2012-09-14T16:06:50.920 回答
4

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

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

于 2012-09-14T16:09:57.177 回答
4

当你写

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

i隐式转换为双精度值,这会产生一个临时值或rvalue。不允许非常量引用绑定到右值,因此r需要 adouble const&才能使上述内容起作用。

于 2012-09-14T16:10:15.913 回答