是否引用了C ++中的非法引用?

时间:2015-02-06 06:08:04

标签: c++ reference

int main(){
int ival=1024;
int &refVal=ival;
int &refVal2=refVal;
return 0;
}

C ++ Primer(第5版)说 “因为引用不是对象,我们可能没有定义对引用的引用。”(中文第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中,符号&&用于定义右值引用。

我认为比较引用和指针更能说明理解为什么对引用的引用没有意义。

enter image description here

答案 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-list T,”然后是类型   D的标识符是“ derived-declarator-type-list T的引用。”

因此,如果声明T D1中的标识符类型为"引用T",则声明T & D1中的标识符类型将是"对T"的引用的引用。换句话说,要尝试声明对引用的引用,您可以执行以下操作:

int & & refref = refVal;

但是,由于[dcl.ref] / p5:

,此代码格式错误
  

不应引用引用,也不引用引用数组,   并没有指向参考的指针。

标准中有一条单独的规则,如果TREFT&的typedef,那么当您尝试执行TREF&时,而不是因为上面的规则,引用将崩溃,以便TREF&实际上意味着T&。类似的折叠规则适用于decltype(...)。当您尝试直接声明引用引用时,此规则不适用。