为什么引用在C ++中不可重定位

C ++引用具有两个属性:


他们总是指向同一个对象。

它们不能为0。

指针相反:


它们可以指向不同的对象。

它们可以是0。

为什么在C ++中没有“不可为空的,可重定位的引用或指针”?我想不出为什么引用不可重新引用的充分理由。


编辑: 问题经常出现,因为当我要确保“关联”(在这里避免使用“引用”或“指针”一词)永远不会无效时,我通常会使用引用。


我认为我从来没有想过“太棒了,这个引用总是指向同一个对象”。如果引用是可重新定位的,则仍然可以得到如下所示的当前行为:


int i = 3;

int& const j = i;

这已经是合法的C ++,但毫无意义。


我这样重申我的问题: “'引用是对象'设计的背后原理是什么?为什么认为引用始终是同一个对象而不是仅在声明为const时有用?”


干杯,菲利克斯


Cats萌萌
浏览 575回答 3
3回答

开满天机

Stroustrup的“ C ++的设计和演进”中给出了C ++不允许您重新绑定引用的原因:初始化后无法更改引用所指的内容。也就是说,一旦初始化了C ++引用,以后就不能再引用另一个对象了;它不能重新绑定。我过去曾被Algol68引用所困扰,在其中r1=r2可以通过分配给所引用r1的对象,也可以根据的类型为r1(重新绑定r1)分配新的引用值r2。我想避免在C ++中出现此类问题。

呼唤远方

在C ++中,通常说“引用是对象”。从某种意义上说是正确的:尽管在编译源代码时将引用作为指针处理,但是引用旨在表示调用函数时未复制的对象。由于引用不能直接寻址(例如,引用没有地址,并且返回对象的地址),因此在语义上重新分配它们是没有意义的。而且,C ++已经具有指针,用于处理重新设置的语义。

慕尼黑的夜晚无繁华

因为那样您就不会有不能为0的可重定位类型。除非您提供了3种引用/指针类型。哪一种只会使语言复杂化而得不到什么收益(然后为什么也不要添加第4种类型呢?非可重复引用可以为0?)一个更好的问题可能是,为什么您希望引用可以重新定位?如果确实如此,那将使它们在许多情况下不那么有用。这将使编译器更难进行别名分析。似乎Java或C#中的引用可重新访问的主要原因是因为它们完成了指针的工作。他们指向对象。它们不是对象的别名。以下效果是什么?int i = 42;int& j = i;j = 43;在当今的C ++中,具有不可重复的引用,这很简单。j是i的别名,并且i最终取值为43。如果参考是可重新设置的,则第三行将参考j绑定到其他值。它不再是别名i,而是别名整数43(当然是无效的)。也许是一个更简单(或至少在语法上有效)的示例:int i = 42;int k = 43;int& j = i;j = k;具有可重新引用的参考。评估此代码后,j将指向k。使用C ++的不可重复引用,j仍指向i,并且为i分配值43。使引用可重新定位会更改语言的语义。该引用不再是另一个变量的别名。相反,它具有自己的赋值运算符,成为一种单独的值类型。然后,引用的最常见用法之一将是不可能的。并没有任何回报。新获得的引用功能已经以指针的形式存在。因此,现在我们有两种方法可以完成相同的工作,而没有任何方法可以完成当前C ++语言中的引用。
打开App,查看更多内容
随时随地看视频慕课网APP