为什么这种从int到double的转换不起作用?

Why does this conversion from int to double& not work?

本文关键字:转换 不起作用 double int 为什么      更新时间:2023-10-16

错误!

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

int i = 42;
double &r = i;

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

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

double const & r = i;

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

当你写的时候

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

i 隐式转换为双精度值,从而生成临时值或右值。不允许将非常量引用绑定到右值,因此r需要成为上述工作double const&

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

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