【发布时间】:2016-06-09 06:36:10
【问题描述】:
我们只能将引用绑定到一个对象,而不是一个字面量或一个更通用的表达式的结果。
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;
但如果是这种情况,那么这个逻辑必须适用于上述两种情况,如果引用类型和对象不同,两者都应该起作用。但实际上,如果类型不同,则程序仅在引用类型为“对常量的引用”时才有效,否则会显示错误。为什么?
【问题讨论】:
-
"Primer 中提到的原因是编译器创建了一个临时..." 不完全是。 原因 是标准规定了某种行为。未指定编译器如何实现该行为。
-
@BoBTFish 链接中提到的右值和左值是什么