为啥这种从 int 到 double& 的转换不起作用?

Posted

技术标签:

【中文标题】为啥这种从 int 到 double& 的转换不起作用?【英文标题】:Why does this conversion from int to double& not work?为什么这种从 int 到 double& 的转换不起作用? 【发布时间】:2012-09-14 16:05:54 【问题描述】:

错误!

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

【问题讨论】:

为什么随机开车投票不予置评?这是一个很好的问题,特别是因为 Moeb 对其进行了研究并发现了一个相关问题,其答案(至少对 Moeb 而言)不太令人满意。 【参考方案1】:
int i = 42;
double &r = i;

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

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

double const & r = i;

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

【讨论】:

但是,const double&amp; 怎么能引用int @Moeb:编辑和解释。 :-)【参考方案2】:

当你写作时

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

i 被隐式转换为双精度值,从而产生一个临时值或 rvalue。不允许非常量引用绑定到右值,因此r 必须是double const&amp; 才能使上述方法起作用。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于为啥这种从 int 到 double& 的转换不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

从 double 到 const int 的 C++ 类型转换无法正常工作

sprintf为啥用int和double 数组也可以存进去?

为啥 AnyVal (Int, Double) 不能是 scala.Serializable 参数的实际参数

C++ 中的 Visual Studio MFC:为啥“int”有效但“double”无效?

为啥 TimeSpan.FromSeconds(double) 舍入到毫秒?

为啥除法后我的 double 或 int 值始终为 0?