これは簡単な質問ですが、Googleで見つけることができません:
整数型(ポインターを含む)の特別な移動コンストラクターはありますか
たとえば、次のようにします。
int* a = new int(2);
int* b = std::move(a);
NULL を指すことが保証されていますか? a と b が だったらどうint
ですか?
NULL を指すことが保証されていますか?
いいえ、変わりません。組み込み型の初期化では、初期化子が変更されることはありません。移動コンストラクター (または のような悪質な非定数コピー コンストラクターauto_ptr
) を使用したクラス型の初期化のみが、それを変更できます。
たとえば、std::unique_ptr
ダムポインターではなく使用した場合a
、の初期化後に空になりますb
。
if
a
とb
were int はどうですか?
まだいいえ。
簡単な答えです。生のポインターはスマート ポインターではないため、いいえ、単純な型を移動しても移動元の値がクリアされないか、少なくともそれが保証されません。raw ポインタ セットを moved from 値から に移動する必要があるのはなぜnullptr
ですか? delete
doubledelete
が何か悪いものや望ましくないものである可能性があるという概念はありません。移動は、オブジェクトを有効であるが指定されていない状態のままにすることを保証するだけであり、単純な型の移動をコピーよりも複雑で非効率的にすることは、確かに直感に反します。「私のためにアドレスを保存する」という上記のセマンティクスは、特別なスマート ポインター タイプまでであり、単純な生のポインターの責任範囲外です。
ただし、標準ライブラリでは、移動とは、移動元のオブジェクトが有効であるが指定されていない状態のままであることを意味することに注意してください。つまり、このような操作の後、移動元のオブジェクトの値は破棄するか、新しい値を割り当てる必要があります。それ以外の場合にアクセスすると、未指定の値が生成されます
引用元 -- http://www.cplusplus.com/reference/utility/move/
したがって、ポインターの場合、a
は未指定の状態にあるため、何でも含めることができます。を使用するa
には、指す新しい値を与える必要があります