2

移動構築の目的で移動されたオブジェクトを、破棄のみ可能な状態のままにしておくことは合法/適切なc++ 0xですか? 例えば:

class move_constructible {...};

int main()
{
    move_constructible x;
    move_constructible y(std::move(x));
    // From now on, x can only be destroyed. Any other method will result
    // in a fatal error.
}

記録のために、割り当てられたメモリ領域を常に指しているはずのポインターメンバーを使用して、c++ クラスの ac 構造体をラップしようとしています。すべての C ライブラリ API は、この前提に依存しています。しかし、この要件は、移動後も x が有効なオブジェクトのままであるためには、独自の割り当てられたメモリ領域が必要になるため、真に安価な移動コンストラクタを作成することを妨げます。c API から対応するクリーンアップ関数を呼び出す前に、最初に NULL ポインターをチェックするようにデストラクタを作成しました。これにより、移動後に少なくとも構造体を安全に破棄できます。

4

1 に答える 1

3

はい、言語はこれを許可します。実際、これは移動セマンティクスの目的の 1 つでした。ただし、他のメソッドが呼び出されないようにしたり、適切な診断を提供したりしないようにすることは、ユーザーの責任です。通常、2 つの値を交換する古典的な例のように、少なくとも代入演算子を使用して変数を「復活」させることもできます。

この質問も参照してください

于 2010-12-24T02:27:20.800 に答える