は、おそらくこれが求められており、すでに答えが、私はのために検索するかわかりません。データメンバーが移動代入演算子が定義されている場合移動セマンティクス
は、非ポインタデータメンバーのセマンティクスを動かすのに使用することはできますか?
は、私はこのようなM::operator=(M&&)
を定義するクラスM
があるとします。
template <class T>
class M
{
public:
M()
{
mem_M = new T;
}
M& operator=(M&& src)
{
if (this != &src)
{
mem_M = src.mem_M;
src.mem_M = nullptr;
}
return *this;
}
private:
T* mem_M;
};
今、明らかに私はT
の移動代入演算子のない利用しない移動コンストラクタで、次のようにクラスC<T>
を持つことができます。
template <class T>
class C
{
public:
C()
{
mem_C = new T;
}
C (C&& rhs)
{
mem_C = rhs.mem_C;
rhs.mem_C = nullptr;
}
private:
T* mem_C;
};
しかし、私は私が入居機能でC<T>::mem_C
に対処する方法を、ポインタが、普通のメンバーでないためにC<T>::mem_C
を何場合はどうでしょうか。私はもちろん、他の1つのインスタンスから提出されたmem_C
を移動する移動代入演算子T::operator=(T&&)
を呼び出すことができますが、どのように私はきちんとC<T>::C(C&&)
に渡さC
のインスタンスをリセットするのですか?
これは、少なくとも私には間違っているになります。
template <class T>
class C
{
public:
C()
{
mem_C = T();
}
C (C<T>&& rhs)
{
mem_C = std::move(rhs.mem_C);
rhs.mem_C = T(); // ?? like this?
}
private:
T mem_C;
};
ので、移動機能に非ポインタデータメンバーをリセットするには、標準に準拠しな方法は何ですか?含まれているタイプの
ポインタは「普通のメンバー」のサブセットです。あなたは移動クラス型と非クラス型 –
'mem_C = T()との違いについて尋ねているように見える;'削除する必要があり、オブジェクトは既に、これは単に時間とリソースを浪費ように構成されています。この場合 –
は、あなたがとデフォルトムーブ代入演算子を使用する必要があり([ゼロのルールを参照してください(http://en.cppreference.com/w/cpp/language/rule_of_three))ことができ –