4

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

编辑:示例

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

2 回答 2

11

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

于 2015-12-23T22:04:19.523 回答
2

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

当被引用的实体以某种方式消失时,就会发生无效的引用和指针。例如,当您引用了 a 中的元素std::vector<T>并且向量的容量发生变化时,该引用将失效,因为底层对象已移开。

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

于 2015-12-23T22:05:08.187 回答