2017-12-12 17 views
-1
CString s("ok"); 
CString alpha=move(s); 

この正確なコードを使用すると、コンパイラはコピーコンストラクタを使用してアルファベットを初期化します。デフォルトではコンストラクタを移動します

私は明示的に移動コンストラクタを定義するとき、それは移動コンストラクタを使用し、必要に応じて作業を完了しました...!

キーワードはMoveキーワードを使用していても(自分で移動コンストラクタを定義していなくても)、コピーコンストラクタを使用しています...なぜ、コンストラクタを移動するのがデフォルトですか?私たちの側で定義されているMoveコンストラクタがない場合、moveキーワードの使用は何ですか?

+5

'move'は関数であり、キーワードではありません。それは何も動かさない。移動コンストラクタは移動を行います。 – chris

+1

[移動の意味は何ですか?](https://stackoverflow.com/questions/3106110/what-are-move-semantics) – user1810087

+0

@chris私はそれを知っています。それは私が仲間に求めているものではありません。私たちのクラスで利用可能な移動コンストラクタがある場合、moveコンストラクタが使用されます。しかし、この移動機能を使用しない場合は、コピーコンストラクタは –

答えて

2

ユーザ定義のコピーコンストラクタ、代入演算子、またはデストラクタを提供する場合、コンパイラはデフォルトの移動コンストラクタを提供しません。オブジェクトをコピーまたは破棄するための特別なロジックが必要な場合は、移動するための特別なロジックが必要であり、単にデフォルトを使用するだけでは危険である可能性が高いという前提があります。そうしないと、コンパイラにデフォルトの移動コンストラクタを指定するよう明示的に指示できます。

struct CString 
{ 
    CString(const CString& other) 
    { 
     // Do whatever 
    } 

    CString(CString&&) = default; 
}; 

これには注意してください。文字列ラッパーの場合は、ダブルコンストラクターを避けるために、移動コンストラクター内のポインターをnullptrに設定する必要があります。

関連する問題