为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
Cats萌萌 2019-11-11 13:15:24
C ++引用具有两个属性:他们总是指向同一个对象。它们不能为0。指针相反:它们可以指向不同的对象。它们可以是0。为什么在C ++中没有“不可为空的,可重定位的引用或指针”?我想不出为什么引用不可重新引用的充分理由。编辑: 问题经常出现,因为当我要确保“关联”(在这里避免使用“引用”或“指针”一词)永远不会无效时,我通常会使用引用。我认为我从来没有想过“太棒了,这个引用总是指向同一个对象”。如果引用是可重新定位的,则仍然可以得到如下所示的当前行为:int i = 3;int& const j = i;这已经是合法的C ++,但毫无意义。我这样重申我的问题: “'引用是对象'设计的背后原理是什么?为什么认为引用始终是同一个对象而不是仅在声明为const时有用?”干杯,菲利克斯
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

Stroustrup的“ C ++的设计和演进”中给出了C ++不允许您重新绑定引用的原因:

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


查看完整回答
反对 回复 2019-11-11
?
呼唤远方

TA贡献1856条经验 获得超11个赞

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


查看完整回答
反对 回复 2019-11-11
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

因为那样您就不会有不能为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 ++语言中的引用。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 574 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信