6

您好,我正在尝试弄清楚这件事..

说我有这个代码。

int a = 5;
double& b = a; //Error.

然后,一旦我将第二行声明为 const,编译器就不再抱怨了。

const double& b = a; //Correct.

幕后到底发生了什么,为什么 const 解决了这个问题。

4

2 回答 2

7

需要int先转换为double。这种转换会产生一个临时的纯右值,并且这些不能绑定到对非常量的引用。

对 const 的引用将延长临时变量的生命周期,否则该临时变量将在创建它的表达式结束时被销毁。

{
    int a = 0;
    float f = a; // a temporary float is created here, its value is copied to
                 // f and then it dies
    const double& d = a; // a temporary double is created here and is bound to 
                         // the const-ref
}   // and here it dies together with d

如果您想知道纯右值是什么,这里有一个关于值类别的不错的SO 线程。

于 2013-08-16T18:36:23.293 回答
6

幕后发生的事情是将 int 隐式转换为 double。隐式转换的结果不是左值,因此不能用于初始化非常量引用。

于 2013-08-16T18:36:15.973 回答