http://en.cppreference.com/w/cpp/language/rule_of_threeオブジェクトが "移動"できる理由は、コンストラクタの移動と代入演算子の移動が不足していますか?
私は数ヶ月前、C++ 11で を始めていると5のルールを見ています。
だから私は、仮想デストラクタを持つすべてのクラスにコピーコンストラクタ/コピー代入演算子/移動コンストラクタ/移動代入演算子をdefaultキーワードで入れ始めました。
このルールでは、明示的なデストラクタを宣言すると、クラスに暗黙的な移動コンストラクタと移動代入演算子がなくなっていると言われたためです。
だから、gccは、移動コンストラクタと移動代入演算子の不足のために、クラスの下で私に文句を言うつもりだと思います。
しかし、うまくいきます!何が起こった??
class Interface {
public:
virtual ~Interface() = default; // implicit destructor
};
class ImplA : public Interface {
public:
virtual ~ImplA() = default; // implicit destructor
};
ImplA first;
ImplA second(first); // copy constructor, OK. understood it.
ImplA third(std::move(first)); // move constructor, it's OK. Why?
second = first; // copy assignment, OK. understood it.
second = std::move(first); // move assignment, it's also OK. Why?
[移動ctor](http://en.cppreference.com/w/cpp/language/move_constructor)のセクション「削除された暗黙的に宣言された移動コンストラクタ」を参照してください。クラスがそこにリストされている条件を満たしていません。 – YiFei
すべては問題ありません。 '= default'デストラクタは暗黙のデストラクタと等価ですので、これらのクラスは5の規則で述べたように'ユーザ定義の 'デストラクタを持つものとして数えません。 –
ルール5に違反するには、 'destructor'を定義してください。あなたのデストラクタは依然としてユーザ定義とはみなされないのでデフォルトです。 – MKR