【问题标题】: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++ 引用肯定是指对象。

标签: 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】:

        一个问题是语法。这样的操作怎么写?您必须创建一个全新的运算符来消除歧义,这对于已经可以用指针完成的事情来说是一笔相当大的投资。

        【讨论】:

          猜你喜欢
          • 2013-09-16
          • 2013-06-12
          • 2011-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          相关资源
          最近更新 更多