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