C++ 为什么对引用的赋值使用复制赋值运算符?

C++ 为什么对引用的赋值使用复制赋值运算符?,c++,c++11,reference,copy-assignment,C++,C++11,Reference,Copy Assignment,对于以下示例: #include <iostream> using namespace std; class Obj { public: Obj& operator=(const Obj& o) { cout << "Copy assignment operator called" << endl; return *this; } }; Obj o;

对于以下示例:

#include <iostream>

using namespace std;

class Obj {
    public:
        Obj& operator=(const Obj& o) {
            cout << "Copy assignment operator called" << endl;
            return *this;
        }
};

Obj o;

int update(Obj& o) {
    o = ::o;
}

int main() {
    Obj o2;
    update(o2);
}

将对象指定给引用时为什么使用副本指定?为什么不更新引用以指向指定的对象?这是一个惯例问题还是背后有原因?

分配给引用会分配给引用所引用的对象,而不是引用本身。因此,您的
update
功能相当于:

o2 = ::o;

你还期待什么?为什么?没有作为目标的引用。@πάνταῥεῖ 我想引用(
Obj&o
)可能会被更新为指向
::o
。引用不能被重新定位-一旦初始化,它们总是引用同一个对象。@NeilButterworth明白了,这回答了我的问题。谢谢你的回复!将其视为通过引用的赋值:新值被赋值给引用所指向的对象。在看到本例的结果后,我现在明白了这一点。然而,我很好奇为什么会出现这种情况。它允许一个通过引用获取参数的函数改变原始对象。一般来说,这比重置引用要有用得多。@johnnyodonnell,因为引用只是对象的另一个名称。引用不是指针。指针指向一个对象。引用就是对象,只是名称不同而已。@NikosC。引用不是指针,但它确实指向对象。在尼尔上述评论的帮助下,我找到了。看起来可以重置引用,但正是因为这种情况,比亚恩决定不允许重置引用。@JohnnyDonnell认为引用指向对象是不正确的,因为所有东西都指向对象,包括非引用。
n
例如在
intn中指向一个内存位置,该位置被解释为保存整数的字节。引用的正确想法是它们是对象的另一个名称。它们不指向对象,与
intn中的
n
指向对象的方式相同不指向对象。这就是目标。
o2 = ::o;