我们只能绑定一个对象的引用,而不是一个文字或一个更真实的表达式的结果。
int i=42;
double d=1.2;
int &r=10;//error:initializer must be an object.
int &r1=d; //error: initializer must be an int object
虽然我们可以将对常量的引用绑定到一个对象,一个文字和一个更通用的表达式的结果,如图所示 -
int j=45;
double d=1.2;
const int &r2=j; // works
const int &r2=60; //works
const int &r3=d; //works
Primer中提到的原因是编译器在这里创建了一个类型为'constant int'的临时对象。
const int temp=d;
const int &r3=temp;
但如果是这种情况,那么这个逻辑必须适用于上述两种情况,如果引用类型和对象不同,两者都应该有效。但实际上,如果类型不同,则程序仅在引用的类型为“引用常量”时才起作用,否则显示错误。为什么?
答案 0 :(得分:2)
简单地说: const 引用会延长临时的生命周期。这是该语言的一个特性,可以避免因临时销毁而引起的悬挂引用。
更确切地说,C ++标准说:
[class.temporary] / P5
有三种情况下,临时表被摧毁的时间点不同于完全表达的结束[...]第三种情况是指参考文献与临时文本联系在一起。
和 [dcl.init.ref] /p5.2
对类型“cv1 T1”的引用由类型为“cv2 T2”的表达式初始化,如下所示:
[..左值和转换案例..]
否则,引用应该是对非易失性const类型的左值引用(即,cv1应为 const),或引用应为右值引用
关于rvalue / lvalue是什么,我建议阅读value categories。
如果您正在使用MSVC:turn your warnings on来解决此特定问题,请提供建议。