int main(){
int ival=1024;
int &refVal=ival;
int &refVal2=refVal;
return 0;
}
C ++ Primer(第5版)说 “因为引用不是对象,我们可能没有定义对引用的引用。”(中文第5版说“不能定义引用的引用”。意思不能定义 对参考的引用。 )
但我得到了上面的代码通过编译。
发生了什么事?
随意纠正任何错误(包括我的英语技能)
答案 0 :(得分:9)
初始化refVal
后,每当你提到它的名字时,它的行为就像它引用的变量ival
---它的"参考性"无法再检测到(decltype
除外)。因此,只需初始化refVal2
即可引用ival
。
没有类型"引用int
",int&(&)
。
答案 1 :(得分:1)
“因为引用不是对象,我们可能无法定义对引用的引用。”
也许他们想说:
int i = 10;
int& ref1 = i;
int&& ref2 = ref1; // Not allowed.
当然,在C ++ 11中,符号&&
用于定义右值引用。
我认为比较引用和指针更能说明理解为什么对引用的引用没有意义。
答案 2 :(得分:1)
您的代码没有引用参考。
int &refVal2
显然是对整数的引用,不是吗?
答案 3 :(得分:0)
您的代码
int &refVal2=refVal;
完全有效且很好。
非法代码是:
int &&refVal2=refVal;
答案 4 :(得分:0)
[dcl.ref] / P1:
在
T D
声明中,其中D
具有任何一种形式& attribute-specifier-seq_opt D1 && attribute-specifier-seq_opt D1
和声明
T D1
中的标识符类型是 “ derived-declarator-type-listT
,”然后是类型D
的标识符是“ derived-declarator-type-list 对T
的引用。”
因此,如果声明T D1
中的标识符类型为"引用T
",则声明T & D1
中的标识符类型将是"对T
"的引用的引用。换句话说,要尝试声明对引用的引用,您可以执行以下操作:
int & & refref = refVal;
但是,由于[dcl.ref] / p5:
,此代码格式错误不应引用引用,也不引用引用数组, 并没有指向参考的指针。
标准中有一条单独的规则,如果TREF
是T&
的typedef,那么当您尝试执行TREF&
时,而不是因为上面的规则,引用将崩溃,以便TREF&
实际上意味着T&
。类似的折叠规则适用于decltype(...)
。当您尝试直接声明引用引用时,此规则不适用。