2017-07-07 7 views
2

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? 
+0

[移動ctor](http://en.cppreference.com/w/cpp/language/move_constructor)のセクション「削除された暗黙的に宣言された移動コンストラクタ」を参照してください。クラスがそこにリストされている条件を満たしていません。 – YiFei

+4

すべては問題ありません。 '= default'デストラクタは暗黙のデストラクタと等価ですので、これらのクラスは5の規則で述べたように'ユーザ定義の 'デストラクタを持つものとして数えません。 –

+0

ルール5に違反するには、 'destructor'を定義してください。あなたのデストラクタは依然としてユーザ定義とはみなされないのでデフォルトです。 – MKR

答えて

5

だから私は、gccが移動コンストラクタが不足しているため、クラスを下回ると代入演算子を動かすことを私に文句を言うために起こっていると思います。

必要な操作は、コピーコンストラクタとコピー代入演算子を使用して実行できるためです。 Interfaceには、まだコピーコンストラクタとコピー代入演算子があり、implcitly declaredです。値は常にconst Interface&にバインドすることが可能です。かかるコピーコンストラクタ:

はより正確には、移動コンストラクタと移動代入演算子を提供してもなくて、Interface

クラスは、この タイプの要件を満たすために移動コンストラクタを実装する必要はありません、まだMoveConstructibleですconst T&引数 は、rvalue式をバインドできます。

およびMoveAssignable

タイプがこのタイプの要件を満たすため に移動代入演算子実装する必要はありません。 は、値またはconst Type&としてそのパラメータを取るコピー代入演算子を、右辺値 引数にバインドします。


ところで:あなたは移動のコンストラクタを作成して、明示的に両方のコピーを代入演算子deleteを移動し、操作は失敗します移動した場合。 rvalue式を使用すると、明示的に削除されたオーバーロードが選択され、失敗します。移動コンストラクタまたは移動代入演算子の宣言のために、コピーコンストラクタおよびコピー代入演算子が暗黙的に削除として宣言されているため、左辺式での使用も失敗します。

+0

移動コンストラクタを明示的に「削除」すれば、移動構築はもはやコンパイルされません。 – rustyx

+0

@RustyXが追加されました。この場合、コピー操作と移動操作の両方が失敗します。 (私もそれを試した[ここ](https://wandbox.org/permlink/hwhID5m6K2FGq16R)) – songyuanyao

関連する問題