が、私はいくつかの入力を保存し、コンパイラは移動コンストラクタと代入演算子を生成するようにしたいという簡単なデータクラスを持っている属性100%C++ 11準拠、それはstd::string y_
属性で正しいことをするでしょうか?移動セマンティクスが適用されますか?デフォルトの移動のコンストラクタの動作は
2
A
答えて
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
関連する問題
- 1. デフォルトの移動コンストラクタ
- 2. デフォルトの移動コンストラクタへの委任
- 3. 移動コンストラクタのデフォルトの引数
- 4. 移動コンストラクタ移動元クラス移動コンストラクタ
- 5. デフォルトではコンストラクタを移動します
- 6. 合成移動コンストラクタの動作
- 7. 移動コンストラクタのないオブジェクトを移動
- 8. テンプレート移動コンストラクタ
- 9. 移動コンストラクタの強制テスト?
- 10. コンストラクタのyandexマップコントローラを移動
- 11. C++ - コンストラクタ、コピーコンストラクタ、移動コンストラクタ、デストラクタ
- 12. 移動コンストラクタ署名
- 13. スイッチデバイス。ボタンのデフォルト動作へのタブ移動
- 14. 移動コンストラクタと非constコピーコンストラクタ
- 15. コンストラクタを移動し、クラス
- 16. 明示的な移動コンストラクタ?
- 17. unique_ptrのコンストラクタとベクトルを移動
- 18. 値渡しファンクションの追加移動コンストラクタ
- 19. コンストラクタと初期化リストの移動
- 20. デフォルトとポインタの移動がポインタ移動で機能しない
- 21. デフォルトの動作が
- 22. PHP:コンストラクタの伝播やコンクリートの子供にコンストラクタを移動
- 23. デフォルトのAppBundleをベンダーの下に移動
- 24. "Effective Modern C++"におけるC++のデフォルトの移動操作
- 25. ケーキのPHPのデフォルトの動作は動作しません。
- 26. ASP.NETツリービューコントロールのデフォルトの動作
- 27. Npgsqlのデフォルトのパラメータ動作
- 28. 'git pull'のデフォルトの動作
- 29. C++移動コンストラクタは、以下の(借り)の例では
- 30. 移動コンストラクタとの混乱:移動コンストラクタを呼び出すことができません
あなたのコンパイラはC++標準に準拠している場合、それは意志標準が要求することをしてください。だから一般的に、あなたのコンパイラが何をしているのか心配してはいけません。言語のルールに従ってください。 –
(あなたのクラスには削除されたコピーコンストラクタ([demo](http://ideone.com/02sbMw))があります。暗黙の定義が既に必要なものを提供していることを明示的に宣言しないことをお勧めします) –
なぜですかそれはないと思いますか? 'std :: string'は移動可能です。 – NathanOliver