为啥 C++ 不允许重新绑定引用?

Posted

技术标签:

【中文标题】为啥 C++ 不允许重新绑定引用?【英文标题】:why doesn't C++ allow rebinding a reference?为什么 C++ 不允许重新绑定引用? 【发布时间】:2014-11-20 10:51:44 【问题描述】:

重新绑定引用有问题吗?我在谷歌上搜索过这个问题,但我找不到这个问题的相关答案。是什么让 C++ 的设计者决定这样做?

【问题讨论】:

因为它没有意义。当您分配给引用时,您分配给对象本身。 @lqr 因为我们有指针,我们不需要两次相同的东西。 请注意,对于可重新绑定的引用,您可以使用std::reference_wrapperint 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++ 不允许重新绑定引用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥非常量引用不能绑定到临时对象?

在 C++11 中不允许重新定义 lambda,为啥?

为啥 C++ 分配器中没有重新分配功能?

为啥可以在 Chrome 的 devtools 控制台中重新声明“让”? (其他浏览器不允许。)

通过Android模拟的NFC卡,为啥重新绑定到iPhone要删除?明明公交卡可以不删说明这个功能可以实现。

为啥支付宝绑定银行卡显示银行系统繁忙