3 回答
TA贡献1786条经验 获得超13个赞
Stroustrup的“ C ++的设计和演进”中给出了C ++不允许您重新绑定引用的原因:
初始化后无法更改引用所指的内容。也就是说,一旦初始化了C ++引用,以后就不能再引用另一个对象了;它不能重新绑定。我过去曾被Algol68引用所困扰,在其中
r1=r2
可以通过分配给所引用r1
的对象,也可以根据的类型为r1
(重新绑定r1
)分配新的引用值r2
。我想避免在C ++中出现此类问题。
TA贡献1856条经验 获得超11个赞
在C ++中,通常说“引用是对象”。从某种意义上说是正确的:尽管在编译源代码时将引用作为指针处理,但是引用旨在表示调用函数时未复制的对象。由于引用不能直接寻址(例如,引用没有地址,并且返回对象的地址),因此在语义上重新分配它们是没有意义的。而且,C ++已经具有指针,用于处理重新设置的语义。
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 ++语言中的引用。
- 3 回答
- 0 关注
- 574 浏览
添加回答
举报