我不明白移动分配是否能够/自由地改变变量x的地址并使所有指针和引用存储& x无效。 我认为这是假的,因为默认移动分配会移动每个成员并保留此指针,但是它是否有保证?
编辑:示例
int x(1), y(2);
int& ref(x);
x = std::move(y);
// ref still valid ?
答案 0 :(得分:7)
移动到对象或从对象移动不会使对象的引用或指针无效。两个对象的地址保持不变。
答案 1 :(得分:1)
引用只是现有对象的备用名称。也就是说,x
和ref
完全可以互换(虽然我不确定decltype(x)
和decltype(ref)
是否相同):当x
使用其他更改时名称ref
将相应地看到相同的更改。同样,反过来说。指向对象的指针也是如此。
当引用的实体以某种方式消失时,会发生无效的引用和指针。例如,当您对std::vector<T>
中的元素进行引用并且向量的容量发生更改时,引用将失效,因为基础对象会移开。
当然,对于int
使用std::move(y)
的示例而言,无论如何都是毫无意义的:内置类型实际上没有任何移动构造函数,即它等同于副本。但是,即使使用类类型,对象和对它的引用仍然引用同一个对象。