繁体   English   中英

引用和常量

[英]References and constants

我们只能将引用绑定到对象,而不是文字或更广义的表达式的结果。

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;

但是,如果是这种情况,则此逻辑必须同时适用于上述两种情况,并且如果引用和对象的类型不同,则两种逻辑都应起作用。 但是实际上,如果类型不同,则仅当引用的类型为“对常量的引用”时,程序才能运行,否则会显示错误。 为什么呢?

简而言之: const引用可以延长临时生存期。 这是该语言的功能,可以避免因临时破坏而引起的引用晃动。

更准确地说,C ++标准说:

[class.temporary] / P5

daccess-ods.un.org daccess-ods.un.org在三个上下文中,临时变量在与全表达式末尾不同的位置被销毁。第三个上下文是将引用绑定到临时对象时。

[dcl.init.ref] /p5.2

类型“ cv1 T1”的引用由类型“ cv2 T2”的表达式初始化,如下所示:

[..lvalue和转换案例..]

否则,该引用应为对非易失性const类型的左值引用(即cv1为const),或者该引用应为右值引用

至于什么是右值/左值,我建议阅读有关值类别

最后,如果您使用MSVC,请提一个建议:针对此特定问题打开警告

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM