移动分配是否会破坏引用?

Does move assignment break the references?

我不明白移动赋值是否是able/free改变变量x的地址并使所有存储&x的指针和引用无效。 我认为这是错误的,因为默认的移动赋值会移动每个成员并保留 this 指针,但可以保证吗?

编辑:示例

int x(1), y(2);
int& ref(x);
x = std::move(y);
// ref still valid ?

移入或移出对象不会使指向该对象的引用或指针失效。两个对象的地址保持不变。

引用只是现有对象的替代名称。也就是说,xref 是完全可以互换的(尽管我不确定 decltype(x)decltype(ref) 是否相同):当 x 使用另一个进行更改时name ref 将相应地看到相同的变化。同样,反过来。指向对象的指针也是如此。

当引用的实体不知何故消失时,引用和指针就会失效。例如,当您有一个对 std::vector<T> 中的元素的引用并且向量的容量发生变化时,该引用将失效,因为底层对象移走了。

当然,对于您的 int 示例,使用 std::move(y) 无论如何都是毫无意义的:内置类型实际上没有任何移动构造函数,即,它相当于一个副本。但是,即使使用 class 类型,对象和对它的引用仍然引用同一个对象。