8

重複の可能性:
移動したオブジェクトはどのように使用できますか?
C ++ 11の「movedfrom」オブジェクトの有効な状態を構成するものは何ですか?

C ++ 11で移動セマンティクスを実装する場合、移動元オブジェクトを安全な状態のままにする必要がありますか、それとも「ジャンク」状態のままにすることができますか?

たとえば、次のC ++ 11ラッパーのrawFILE*リソースへの移動コンストラクターを実装するための推奨オプションは何ですか?

// C++11 wrapper to raw FILE*
class File
{
  FILE* m_fp;

public:

  // Option #1
  File(File&& other)
    : m_fp(other.m_fp)
  {
    // "other" left in a "junk" state
  }

  // Option #2
  File(File&& other)
    : m_fp(other.m_fp)
  {
    // Avoid dangling reference in "other"
    other.m_fp = nullptr;
  }

  ...
};
4

2 に答える 2

6

移動元のオブジェクトで実行できる必要があるのは、オブジェクトを破棄することだけです。それを超えて、通常のクラスの不変条件が何であるか、そしてオブジェクトから移動されたかどうかはあなたのクラス次第です。

std::moveたとえば、誰かがインスタンスで使用して後で新しい値を指定したい場合に備えて、オブジェクトに割り当てることができることを確認することをお勧めします。[編集:提案された重複質問の1つへの回答で指摘されているように、一般的なstd::swapテンプレートはオブジェクトから移動してから移動します-これを確実にしない場合は、専門化する必要があるかstd::swap、クラスのユーザーがそれを使用することを禁止します。]

クラスはデストラクタで何もしないので、どちらのオプションでも問題ありません。オプション2は、ユーザーが操作しやすい場合がありますが、移動元のオブジェクトでは何もできないという前提でコーディングしている場合は、違いはありません。ただし、クラスは不完全であるため、デストラクタを作成すると変更される可能性があります。

于 2012-10-30T11:22:08.327 に答える
6

移動元のオブジェクトは引き続きオブジェクトであり、不確定な場合もありますが、有効な状態である必要があります。特に、新しい値を安全に割り当てることができるはずです(もちろん、@ Steveが言うように、破壊可能でなければなりません)。移動元のオブジェクトが有効である限り、クラスにどの特定のセマンティクスを与えるかはあなた次第です。

一般に、「移動」は最適化された「コピー」と考える必要があります。ただし、など、本質的に「移動のみ」である一部のクラスではunique_ptr、追加の保証が適切な場合があります。たとえば、unique_ptr移動後はnullであり、他に何も意味がないことを保証します。

(実際のコードは不完全ですが、aFILE*は一種の移動専用リソースであるため、おそらく壊れているためunique_ptr、可能な限り厳密にエミュレートするか、直接使用する必要があります。)

于 2012-10-30T11:29:27.740 に答える