您好,我正在尝试弄清楚这件事..
说我有这个代码。
int a = 5;
double& b = a; //Error.
然后,一旦我将第二行声明为 const,编译器就不再抱怨了。
const double& b = a; //Correct.
幕后到底发生了什么,为什么 const 解决了这个问题。
需要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 线程。
幕后发生的事情是将 int 隐式转换为 double。隐式转换的结果不是左值,因此不能用于初始化非常量引用。