参考和常量

时间:2016-06-09 06:36:10

标签: c++ reference

我们只能绑定一个对象的引用,而不是一个文字或一个更真实的表达式的结果。

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;

但如果是这种情况,那么这个逻辑必须适用于上述两种情况,如果引用类型和对象不同,两者都应该有效。但实际上,如果类型不同,则程序仅在引用的类型为“引用常量”时才起作用,否则显示错误。为什么?

1 个答案:

答案 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来解决此特定问题,请提供建议。