错误!
$ 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,但我不确定我理解为什么不允许这样做,而允许int
到const double&
?
答案 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&
才能使上述工作正常。