为啥 C++ 不允许重新绑定引用?
Posted
技术标签:
【中文标题】为啥 C++ 不允许重新绑定引用?【英文标题】:why doesn't C++ allow rebinding a reference?为什么 C++ 不允许重新绑定引用? 【发布时间】:2014-11-20 10:51:44 【问题描述】:重新绑定引用有问题吗?我在谷歌上搜索过这个问题,但我找不到这个问题的相关答案。是什么让 C++ 的设计者决定这样做?
【问题讨论】:
因为它没有意义。当您分配给引用时,您分配给对象本身。 @lqr 因为我们有指针,我们不需要两次相同的东西。 请注意,对于可重新绑定的引用,您可以使用std::reference_wrapper
:int x, y; auto r = ref(x);
然后,可以使用r = ref(y)
重新绑定到y。 (假设using std::ref
)
@lqr Java 引用指的是对象(即事物),C++ 引用指的是变量(即存储事物的地方)。它们是碰巧有相同名称的不同概念。
@molbdnilo:不。C++ 引用肯定是指对象。
【参考方案1】:
Stroustrup 的The Design & Evolution of C++ 回答了大多数此类问题。在这种情况下,请参阅第 3.7 节参考:
我过去曾被 Algol68 引用所困扰,其中
r1=r2
可以通过r1
分配给所引用的对象,或者为r1
分配一个新的引用值(重新绑定r1
),具体取决于r2
的类型。我想避免在 C++ 中出现此类问题。 如果你想在 C++ 中做更复杂的指针操作,你可以使用指针。
【讨论】:
【参考方案2】:Bjarne Stroustrup 在语言中引入了引用以支持运算符重载的引用参数(“按引用调用”)。您根本不需要重新绑定引用参数。
如果您想要“可重新绑定的引用”,请使用指针。
【讨论】:
【参考方案3】:在 C++ 中,引用只是对象的另一个名称。这不是间接的;这就是为什么你不能让它指向不同的对象。
【讨论】:
从机械上讲,它可能是间接的(例如,通过引用传递)。但是,从语法上讲,与指针不同,不需要引用引用的步骤(听起来很奇怪,引用总是在语法上取消引用)。【参考方案4】:引用很有用,因为它们不支持不安全的指针算术并且永远不会为空。另一方面,指针可以被反弹并且可以放置在 STL 容器中。权衡所有这些有用的属性是std::reference_wrapper:
#include <functional>
#include <iostream>
#include <string>
int main()
std::string s1 = "my", s2 = "strings";
auto r = std::ref(s1); // bind
// use r.get() to access the referenced object
std::cout << '\'' << r.get() << "' has " << r.get().size() << " characters\n";
r = s2; // rebind
// use the other object
std::cout << '\'' << r.get() << "' has " << r.get().size() << " characters\n";
【讨论】:
【参考方案5】:首先,“引用”实际上是 const 指针。如果你想“重新绑定”,只需使用普通指针。
其次,我们不能在 C++ 中重新绑定引用。
ref1 = ref2; // It's not mean "rebinding" - it just modify the object which ref1 points.
所以,我们需要创建一个新的操作符,像这样
ref1 :=: ref2;
这将是 C++ 的一个脏点,不是吗?
【讨论】:
谢谢兄弟。你的回答很有帮助! 算子:=:
被认为定义为draft N3553中的“交换算子”。【参考方案6】:
一个问题是语法。这样的操作怎么写?您必须创建一个全新的运算符来消除歧义,这对于已经可以用指针完成的事情来说是一笔相当大的投资。
【讨论】:
以上是关于为啥 C++ 不允许重新绑定引用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥可以在 Chrome 的 devtools 控制台中重新声明“让”? (其他浏览器不允许。)