2013-05-17 9 views
5

私のクラスでは、メンバー変数としてstd::vectorなどを使用します。メンバー変数には、独自の移動コンストラクタが付属しています。私はクラスの移動コンストラクタを明示的に宣言しておらず、暗黙のうちにほとんどの場合宣言されていません。可能であれば、一時オブジェクト内のメンバ変数は暗黙的に移動されていますか?

myクラスの暗黙のコピーコンストラクタまたは暗黙の代入演算子がrvalueで呼び出された場合、移動コンストラクタを持つメンバーはコピーまたは移動されますか?

移動した場合、移動可能なメンバーでクラスを使用するときに一時的な使用を避ける理由はありますか?

+0

C++ 11を使用している場合は、C++ 03がコピーされると移動されます。 C++ 11では、すべての標準ライブラリコンテナクラスが移動セマンティクスを利用します。 –

+0

コピーコンストラクタを明示的に宣言しても、これは当てはまりませんか?私が知る限り、const参照を右辺値に付して内容を割り当てると、メンバーの移動代入演算子は使用できません。 – gokturk

+0

_ "ほとんどの場合、暗黙に宣言されていません" _型には移動セマンティクスがないため、メンバーを移動する方法はありません –

答えて

0

コピーコンストラクタには、暗黙的に作成されたものでも明示的に宣言されたものでも1つのシグネチャしかないため、コンパイラがそのコンストラクタの右側のオペランドに応じて異なるコードを生成する方法はありません。 にはすべての場合に可動属性をコピーするためにがあります。なぜなら、コピーコンストラクタにはすべての可能な入力に対して機能するコードが1セットしかないからです。

あなたの最後の質問はパフォーマンス関連かもしれないとは思いますが、私は確信することはできません。私が示唆していることは、最も明白なコードを書いて、オプティマイザにそれに亀裂が入ることです。次に、結果をプロファイルして、一時的な作成と破壊が問題を引き起こしているかどうかを確認し、代替メカニズムを検討する必要がある場合のみ参照してください。

4

クラスが移動コンストラクタ/代入演算子を明示的に宣言せず、暗黙的に宣言されていない場合は、暗黙的に宣言されたコピーctor/assignment-opはメンバーを移動せずコピーします。

あなたのクラスに対してmove ctor/assignment-opが暗黙的に宣言された場合、それらは移動されます。彼らはそうではないと言います - それはなぜですか?あなたのクラスにはカスタムデストラクタがありますか?カスタムdtor、コピー/移動ctor、コピー/移動割り当てオペレーション(「ゼロのルール」とも呼ばれる)を必要としない設計に努めなければなりません。

カスタムdtorが必要な場合は、moveセマンティクスを使用するようにmove ctor/assignment-opを明示的に宣言する必要があります。コンパイラがサポートしている場合は、デフォルトとして宣言できます。

+0

"コンパイラがサポートしている場合は、デフォルトとして宣言できます。 "ほとんどの場合、それは悪い考えではありませんか(5つのルール)? – dyp

+0

"あなたはそうではないと言います - それはなぜですか?はい、ほとんどがデストラクタを持っています。 – gokturk

+1

@DyP問題のクラスは暗黙的に定義されたコピーctorsを持っているようですので、すでに壊れているかdtorはデフォルトの移動に影響を与えないものだけを記録します。 – Angew

関連する問題