2015-02-06 193 views
4
int main(){ 
int ival=1024; 
int &refVal=ival; 
int &refVal2=refVal; 
return 0; 
} 

C++入门(第五版)非法表示 “因为引用是不是对象,我们可以不定义为参考基准。”(中国第5版说:“不能定义引用的引用“。意思不能定义 引用参考。)IS参考参考在C++?

但我得到了上面的代码通过编译。

发生了什么事?

随时纠正任何错误(包括我的英语技能)

+3

违法驾驶高速公路上的岩石是非法的。 (也就是说,你甚至怎么做?因为你的代码没有) – 2015-02-06 06:23:09

+0

引用是对象本身的别名。因此,当您尝试对引用进行引用时,引用将它传递给对象本身,以便最终只引用另一个对象。 – Galik 2015-02-06 06:37:31

回答

1

“因为引用不是对象,我们可以不定义为基准的参考。”

也许他们的意思是说:

int i = 10; 
int& ref1 = i; 
int&& ref2 = ref1; // Not allowed. 

当然,在C++ 11中,符号&&用来定义右值引用。

我认为这是更具说明性的比较引用和指针来理解为什么引用引用没有意义。

enter image description here

+0

我认为代码是OP的,试图在本书中测试声明的真实性。 – 2015-02-06 06:16:12

+0

不,他们没有提及* rvalue * vs * lvalue *引用。他们说没有这样的类型作为对引用的引用,而只是对象或函数。 – 2015-02-06 08:47:38

9

refVal之后被初始化,每当你提到它的名字,它的行为像可变ival它指的是---不能再被检测到它的“referenceness”(除decltype)。因此refVal2也简单地初始化为指ival

没有类型“参照int”,int&(&)

1

您的代码没有参考引用。

int &refVal2 

显然是对整数的引用,不是吗?

+0

那么什么是“参考参考”? – guangzhi 2015-02-06 06:19:15

+0

@光之:没有这样的事情。没有语法。 – 2015-02-06 06:20:12

+0

作者是什么意思?他为什么说现在没有这样的事情? – guangzhi 2015-02-06 06:30:26

0

您的代码

int &refVal2=refVal; 

是完全有效和罚款。

非法代码将是:

int &&refVal2=refVal; 
+1

运算符&&与引用无关,不是吗? – guangzhi 2015-02-06 06:25:14

+2

'int && refVal2 = refVal;'是非法的,但出于与“参考参考”无关的不同原因。 – 2015-02-06 07:34:57

+0

但是'int && refVal2 = std :: move(refVal);'是合法的。 * rvalue *引用与关于引用引用的问题有什么关系? – 2015-02-06 08:49:07

0

[DCL。定]/P1:

在声明T D其中D具有任一形式

​​

和在声明T D1标识符的类型是 “衍生声明符类型列表T“,那么D的 标识符的类型是”派生的声明者类型列表T的参考“。

因此,如果在声明T D1标识符的类型是“参照T”,然后在声明T & D1的标识符的类型将是“引用来引用到T”。换句话说,试图声明引用来引用,你会做这样的事情:

int & & refref = refVal; 

然而,这个代码是因为[dcl.ref]/P5非法的构造:

应该没有对引用的引用,没有引用数组, ,也没有指向引用的指针。

有标准的独立规则,即如果TREFT&一个typedef,那么当你尝试做TREF&,而不是因为规则的失败之上,参考文献将崩溃使TREF&实际上意味着T&。类似的折叠规则适用于decltype(...)。当您试图直接声明对引用的引用时,此规则不适用。