タグ付けされた質問 「move-semantics」

4
なぜコピーしてから移動するのですか?
誰かがオブジェクトをコピーし、その後それをクラスのデータメンバーに移動することにしたコードをどこかに見ました。これは、移動の全体のポイントがコピーを避けることであると思ったので、私を混乱させました。次に例を示します。 struct S { S(std::string str) : data(std::move(str)) {} }; ここに私の質問があります: 右辺値参照を使用しないのはなぜstrですか? 特に次のような場合、コピーは高価になりませんstd::stringか? 著者がコピーを作成して次に移動することを決定した理由は何ですか? いつ自分でこれを行うべきですか?

8
initializer_listおよび移動セマンティクス
から要素を移動することはできstd::initializer_list<T>ますか? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } 以来std::intializer_list<T>、特別なコンパイラの注意を必要とし、C ++標準ライブラリの通常のコンテナのような値のセマンティクスを持っていない、私はむしろ後悔するより安全であると聞いて思います。

5
移動のみのタイプのベクターをリスト初期化できますか?
GCC 4.7スナップショットを介して次のコードを渡すと、unique_ptrsをベクターにコピーしようとします。 #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } std::unique_ptrはコピーできないため、明らかに機能しません。 エラー:削除された関数の使用 'std :: unique_ptr <_Tp、_Dp> :: unique_ptr(const std :: unique_ptr <_Tp、_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp、_Dp> = std :: unique_ptr] ' …

3
ベクトルが大きくなったときに移動セマンティクスを強制する方法は?
std::vectorあるクラスのオブジェクトを持っていますA。クラスは自明ではなく、コピーコンストラクターと移動コンストラクターが定義されています。 std::vector<A> myvec; ベクターをAオブジェクトで(たとえばを使用してmyvec.push_back(a))埋めると、コピーコンストラクターA( const A&)を使用してベクターの要素の新しいコピーをインスタンス化し、ベクターのサイズが大きくなります。 A代わりに、クラスの移動コンストラクタが代わりに使用されていることを強制できますか?

4
デフォルトのmove-assignment / move-constructorがないのはなぜですか?
私は単純なプログラマーです。私のクラスメンバーの変数は、ほとんどの場合、PODタイプとSTLコンテナーで構成されています。このため、代入演算子やコピーコンストラクタを記述する必要はほとんどありません。これらはデフォルトで実装されているからです。 これに加えて、std::move移動できないオブジェクトで使用する場合は、代入演算子を使用するため、std::move完全に安全です。 私は単純なプログラマーなので、コンパイラーが " this->member1_ = std::move(other.member1_);..." として実装するだけなので、作成するすべてのクラスに移動コンストラクター/割り当て演算子を追加せずに、移動機能を利用したいと思います。 しかし、そうではありません(少なくともVisual 2010ではそうではありません)。これには特別な理由がありますか? さらに重要なことには; これを回避する方法はありますか? 更新: GManNickGの答えを見ると、GManNickGはこのための優れたマクロを提供しています。また、知らない場合は、移動セマンティクスを実装すれば、メンバーのスワップ関数を削除できます。

2
すでに構築されたオブジェクトに対するstd :: moveとemplace_back()を使用したC ++ 11 push_back()の効率
C ++ 11では、インプレース構築が可能であるemplace_back()ため、(効率の観点から)一般的に好まれますが、すでに構築されたオブジェクトで使用する場合も同様ですか?push_back()push_back(std::move()) たとえばemplace_back()、次のような場合でもまだ好まれますか? std::string mystring("hello world"); std::vector<std::string> myvector; myvector.emplace_back(mystring); myvector.push_back(std::move(mystring)); // (of course assuming we don't care about using the value of mystring after) さらに、上記の例には、代わりに次のような利点がありますか。 myvector.emplace_back(std::move(mystring)); または、ここでの移動は完全に冗長ですか、それとも効果がありませんか?

3
移動したコンテナを再利用しますか?
移動したコンテナを再利用する正しい方法は何ですか? std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); 私がC ++ 0x標準ドラフトで読んだものから。ver3は正しい方法のようです。移動後のオブジェクトは、 「特に明記されていない限り、そのような移動元のオブジェクトは、有効であるが指定されていない状態に置かれるものとします。」 「他の方法で指定された」インスタンスは見つかりませんでした。 ver3は少し回り道で、ver1の方がはるかに好ましいと思いますが、vec3は追加の最適化を可能にしますが、一方で、簡単に間違いを引き起こす可能性があります。 私の仮定は正しいですか?

4
std :: mapのキーからリソースを盗むことはできますか?
C ++では、後で不要になったマップからリソースを盗んでも大丈夫ですか?より正確には、std::mapwith std::stringキーがあり、をmap使用してsキーのリソースを盗むことでそれからベクターを構築したいと仮定しますstd::move。キーへのそのような書き込みアクセスは、内部データ構造(キーの順序)を破壊することに注意してください。ただし、map後で使用することはしません。 質問:問題なくこれを実行できますか?または、意図されていないmap方法でアクセスしたために、たとえばのデストラクタで予期しないバグが発生std::mapしますか? 以下はプログラム例です。 #include<map> #include<string> #include<vector> #include<iostream> using namespace std; int main(int argc, char *argv[]) { std::vector<std::pair<std::string,double>> v; { // new scope to make clear that m is not needed // after the resources were stolen std::map<std::string,double> m; m["aLongString"]=1.0; m["anotherLongString"]=2.0; // // now steal resources for (auto &p …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.