2016-05-19 21 views
2

が、私はいくつかの入力を保存し、コンパイラは移動コンストラクタと代入演算子を生成するようにしたいという簡単なデータクラスを持っている属性100%C++ 11準拠、それはstd::string y_属性で正しいことをするでしょうか?移動セマンティクスが適用されますか?デフォルトの移動のコンストラクタの動作は

+1

あなたのコンパイラはC++標準に準拠している場合、それは意志標準が要求することをしてください。だから一般的に、あなたのコンパイラが何をしているのか心配してはいけません。言語のルールに従ってください。 –

+0

(あなたのクラスには削除されたコピーコンストラクタ([demo](http://ideone.com/02sbMw))があります。暗黙の定義が既に必要なものを提供していることを明示的に宣言しないことをお勧めします) –

+1

なぜですかそれはないと思いますか? 'std :: string'は移動可能です。 – NathanOliver

答えて

3

ルールです:

、暗黙的に定義されたコピー/非ユニオンクラスのコンストラクタを移動するXは、そのベースとメンバのメンバーワイドコピー/移動 を実行します。

この場合、x_y_の両方を移動 - 構成/割り当てます。 Aから、あなたが移設/譲渡していることがわかります。


そのメンバーの一人が移動コンストラクタが暗黙的に定義されていない場合、デフォルトした移動コンストラクタははまだコピーを実行できることに注意してください:

struct A { 
    A() { } 
    A(A const&) { } 
    // A(A&&) not implicitly defined because of the copy ctor 
}; 

struct B { 
    B() = default; 
    B(B&&) = default; 
    B& operator=(B&&) = default; 

    A a; 
}; 

B b; 
B c = std::move(b); // copy-constructs c.a from b.a 
1

はい、これは、特別なメンバー関数を生成する全体のポイントです。

しかし、あなたがメンバーにコンストラクタのパラメータを移動するのを忘れ:、[class.copy]から、

A(int x, std::string&& y) : x_(x), y_(std::move(y)) {} 
//         ^^^^^^^^^^^
+0

ありがとう。簡単なテストケースを書いている間、それを忘れてしまった。更新された質問 – rustyx

関連する問題