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