[英]Unsure about a description regarding Reference in C++ Primer
书中说:因为引用不是对象,我们可能没有定义对引用的引用。
int ival = 1024;
int &refVal = ival;
refVal = 2;
int ii = refVal;
int &refVal3 = refVal; // isn't this a definition of ref to ref?
int i = refVal;
int &refVal4 = 10;
double dval = 3.14;
int &refVal5 = dval;
但是,该行不是错误,因为refVal3说它只是refVal的另一个别名,而refVal只是ival的另一个名称(refVal3绑定到refVal绑定到的对象,即ival)...所以refVal和refVal3都引用了ival的初始化器。
这是完全合理的,但如果这不是对引用的引用的定义,那么当它提到“因为引用不是对象时,我们可能没有定义对引用的引用”这本书究竟是什么意思。 ??
有人可以举个例子吗?
你的理解是正确的。
int &refVal3 = refVal;
这使得refVal3
引用了同样的东西, refVal
就是refVal
的引用。 也就是说, ival
。
当书中提到“因为引用不是对象时,我们可能无法定义对引用的引用”。 ?
引用只能引用一个对象。 但引用不是对象。 所以引用不能引用参考。 当这本书说明这一点时,它并不仅仅意味着它不被允许,如果你尝试,你会得到一个错误。 但你甚至无法尝试。 它没有语法。 因为您尝试对引用执行任何操作,您实际上将对其引用的对象执行操作,而不是对引用本身执行操作。
有人可以举个例子吗?
不,我不能。 这就是重点。 根本就没有它的语法。
T & &
)。 其中T
是一个对象类型(包括int
,如在你的例子中):
你可以对T
进行(左值)引用 。 存在类型T &
。
你可以对T
进行右值引用 。 存在类型T &&
。
T &&
不是参考文献的参考 ; &&
是一个单一的标记 ,并不代表& &
。
您不能引用对T
引用。 没有这样的类型 , T & &
T & &&
, T && &
或T && &&
。 如果您编写一个尝试显式命名此类型的声明,则这是一个错误。
(类似地, cv限定类型如const T&
exists,而const T & &
等类型不存在。)
你问了一个例子。 考虑这个错误的代码:
int main()
{
int ival = 1024;
int &refVal = ival;
int & &refRefVal = refVal; // wrong
}
这是一个错误,因为没有int & &
这样的类型。 无论我试图用什么来初始化它都是一个错误。
(严格来说,这是一个错误,因为语言的语法禁止它。标准委员会可以选择允许我写int & &
并且它意味着与int &
相同的东西 - 参见下面的参考折叠 - 但是他们没有,这很好,因为那会很混乱。)
错误:'refRefVal'被声明为对引用的引用
其他编译器也会出现类似错误。 例如, Microsoft Visual C ++提供 :
错误C2529:'refRefVal':对引用的引用是非法的
引用在它们出现的大多数上下文中自动解除引用。 你尝试对引用做的任何事情,实际上你正在对它引用的对象做这件事。 与指针不同,没有用于取消引用引用的运算符; 实际上,引用是引用对象的名称。
您编写的内容( int &refVal3 = refVal;
)不是错误,因为您只是初始化绑定到同一对象的第二个引用。 要了解其原因,请考虑几个语句的效果。
在这里创建一个int
,用值1024
初始化它:
int ival = 1024;
在这里,您创建一个左值引用,绑定到该int
对象:
int &refVal = ival;
在这里,您将2
指定给原始int
对象,因为refVal
用作它所引用的对象:
refVal = 2;
在这里,您创建第二个int
对象,使用原始对象的值初始化,也因为refVal
用作它引用的对象:
int ii = refVal;
在这里,您对原始对象进行第二次左值引用,也因为refVal
用作它所引用的对象:
int &refVal3 = refVal;
因此,看起来像它创建对第一个引用的第二个引用的代码实际上是创建对原始对象的第二个引用。
这就是int &refVal3 = refVal;
的原因int &refVal3 = refVal;
引入了对原始对象的另一个引用 - 而不是试图创建对引用的引用 - 这只是refVal
被自动refVal
为它引用的int
另一个结果 。
你不能写出像T & &
你自己这样的类型,但是这个呢?
using Ref = int&;
using RefRef = Ref&; // I named this poorly, it's not really a reference to a reference!
这会导致编译器看到我正在尝试将类型别名RefRef
设置为int& &
。 编译器遵循参考折叠规则 。 它将两个引用合并为一个,因此效果与我写的一样:
using RefRef = int&;
这种行为在涉及类型推导的情况下非常有用,例如使用模板 ,通过允许更多代码按预期编译和工作,以及促进完美转发 。 (有人可能会认为这也是平行你观察到的东西-当你初始化从参考参考,你仍然可以永远到不了的参考的参考,只有一个对象。)
在任何情况下都没有任何类型参考参考的东西。 C ++语言根本就没有这样的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.