代码之家  ›  专栏  ›  技术社区  ›  jkeys

为什么重置引用是非法的/不道德的?[副本]

  •  3
  • jkeys  · 技术社区  · 17 年前

    可能重复:
    Why are references not reseatable in C++

    我试图或多或少地交换两个参考变量(实际上,我可以交换实际变量)。我试图通过创建一个临时变量并使其中一个引用等于另一个引用来实现这一点,但编译器拒绝了这一点。以下是一个例子:

    void Foo()
    {
       //code
       int& ref1 = a;
       int& ref2 = b;
       int temp;
    
       temp = ref1;
       ref1 = ref2;
       ref2 = temp;
    
       //or, better yet
       std::swap(ref1, ref2);
    }
    

    Here 是指向Faq Lite的链接,以供参考(<--,明白吗?)。

    5 回复  |  直到 9 年前
        1
  •  11
  •   anon anon    17 年前

    因为没有语法可以执行此操作:

    int x = 0;
    int y = 1;
    int & r = x;
    

    现在如果我说:

    r = y;
    

    我将y的值赋给x。如果我想重新安装,我需要一些特殊的语法:

    r @= y;    // maybe?
    

    由于使用引用的主要原因是作为参数和函数的返回类型,而这并不是一个问题,因此C++的设计者似乎不认为这是一条值得走下去的道路。

        2
  •  7
  •   Loki Astari    17 年前

    引用是对象的别名。

        3
  •  3
  •   Brian R. Bondy    17 年前

    因为引用没有自己的地址(如果有,则依赖于实现,并且您不能直接使用&运算符访问它们)。

    政府;运算符用于获取引用引用的对象的地址。

    int x = 4;
    int *p = &x;
    //p holds the address of x
    //&p holds the address of p.
    
    int &r = x;
    //&r holds the address of x
    

    如果某个东西没有自己的地址,那么它就不能在里面存储值。如果它不能在里面存储一个值,那么它就不能被改变。

    我认为 parashift C++ FAQ on references

    重要提示:即使 引用通常使用 基础程序集中的地址 语言,请不要想一个 作为有趣指针的引用 指向一个对象。引用是 对象它不是指向 对象,也不是该对象的副本。信息技术

    又在 FAQ 8.5 :

    绑定到一个对象,它不能被 “重置”到另一个对象。这个 引用本身不是一个对象(它是 推荐人给你的地址是 指代物;记住:参考资料 是它的参照物)。

        4
  •  1
  •   Pavel Minaev    17 年前

    再次查看您的代码:

    temp = ref1;
    ref2 = temp;
    ref1 = ref2;
    

    引用是别名。对引用执行的所有操作都是对其引用的对象执行的。在上面的代码中,编译器如何神奇地知道您不是在尝试将值分配给引用的变量,而是在尝试更改引用本身?没有语法表明这两者之间的区别,例如:

    ref1 = 3;
    

    您通常希望将值3指定给引用的对象 ref1

    简言之,这完全是出于设计。如果您想要“可重置”引用,那么您只需使用指针(或者,如果您想要避免意外的指针算术, boost::optional

        5
  •  1
  •   LBushkin    17 年前

    与指针不同,引用的设计目的是确保它们始终引用对象。为了满足这个要求,编译器要求在声明中初始化所有引用,并且不允许您重新分配它们。