移動割り当てが変数 x のアドレスを変更できるかどうか、または自由に変更できるかどうか、および &x を格納するすべてのポインターと参照を無効にするかどうかがわかりません。デフォルトの移動割り当ては各メンバーを移動し、 this ポインターを保持するため、それは false だと思いますが、それは保証されていますか?
編集:例
int x(1), y(2);
int& ref(x);
x = std::move(y);
// ref still valid ?
移動割り当てが変数 x のアドレスを変更できるかどうか、または自由に変更できるかどうか、および &x を格納するすべてのポインターと参照を無効にするかどうかがわかりません。デフォルトの移動割り当ては各メンバーを移動し、 this ポインターを保持するため、それは false だと思いますが、それは保証されていますか?
編集:例
int x(1), y(2);
int& ref(x);
x = std::move(y);
// ref still valid ?
オブジェクトへの移動またはオブジェクトからの移動によって、オブジェクトへの参照またはポインタが無効になることはありません。両方のオブジェクトのアドレスは同じままです。
参照は、既存のオブジェクトの単なる代替名です。つまり、x
とref
は完全に交換可能です (ただし、decltype(x)
とdecltype(ref)
が同一かどうx
かref
はわかりません)。同様に、その逆です。オブジェクトへのポインターについても同様です。
参照とポインタの無効化は、参照されたエンティティが何らかの形で消えたときに発生します。たとえば、 内の要素への参照がstd::vector<T>
あり、ベクトルの容量が変更された場合、基になるオブジェクトが移動するため、参照は無効になります。
もちろん、あなたのint
使用例はstd::move(y)
とにかく無意味です。組み込み型には実際には移動コンストラクターがありません。つまり、コピーと同等です。ただし、クラス型を使用する場合でも、オブジェクトとそれへの参照は同じオブジェクトを参照します。