問題タブ [move-assignment-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - デフォルト/コピー/ムーブctorおよびコピー/ムーブ代入演算子の自動生成の条件は?
コンパイラーがデフォルトのコンストラクター、コピーコンストラクター、および代入演算子を通常自動生成する条件で、メモリを更新したいと思います。
いくつかのルールがあったことを思い出しますが、覚えていません。また、信頼できるリソースをオンラインで見つけることができません。誰か助けてもらえますか?
c++ - 移動代入演算子と「if (this != &rhs)」
クラスの割り当て演算子では、通常、割り当てられているオブジェクトが呼び出し元のオブジェクトであるかどうかを確認する必要があるため、混乱を招くことはありません。
移動代入演算子にも同じことが必要ですか? 真になる状況はthis == &rhs
ありますか?
c++ - 移動代入演算子で std::swap を使用してデストラクタ ロジックを再利用することは理にかなっていますか?
次の点を考慮してください。
ここでの私の考えでは、デストラクタはまもなく「その他」で実行されるため、スワップを使用して移動代入演算子でデストラクタ ロジックを再度実装する必要はありません。しかし、それが合理的な仮定であるかどうかはわかりません。これは「大丈夫」でしょうか?
c++ - ムーブ代入演算子に関する質問
リソースを管理する次のクラスを想像してください (私の質問は移動代入演算子についてのみです)。
質問:
上記の 2 つの Move 代入演算子 #1 と #2 の長所と短所は何ですか? 私が見ることができる唯一の違いはstd::swap
、lhsのストレージを保持することだと思いますが、とにかく右辺値が破棄されるため、それがどのように役立つかわかりません。たぶん唯一の場合は のようなものですa1 = std::move(a2);
が、この場合でも #1 を使用する理由はありません。
c++ - destruct + move構文によるムーブ代入は安全ですか?
ムーブコンストラクタを使用して、ほとんどすべてのクラスのムーブ代入を定義する非常に簡単な方法は次のとおりです。
独自のデストラクタを呼び出してから、このポインタに新しい配置を行うというこのシーケンスは、標準のC ++ 11で安全ですか?
c++ - ベクトル クラスにはどのような ctor/代入演算子が必要ですか?
私は独自のベクトル クラス (x、y 値のコンテナー) を作成していますが、どのコンストラクター/代入演算子を自分で実装する必要があるのか 、コンパイラーが提供するものを期待できるのかよくわかりません。明らかに、デフォルトの動作を持たないメソッドや自動生成されないメソッドを作成する必要があります。しかし、確かに、コンパイラがまったく同じものを生成できる場合、何かを実装しても意味がありません。
私はVisual Studio 2010を使用しています(これはC++ 11の側面で問題になる可能性があります)。また、それが重要な場合、私のクラスはテンプレートです。
現在、私は持っています:
move ctor/move operator がある場合、copy ctor/assignment operator は必要ですか?
c++ - Std::stringstream 移動代入が gcc で機能しない
次のような割り当て
gccでコンパイルするとエラーが発生します:
std::stringstream
これで、ストリームを明らかにコピーできず、のコピー コンストラクターが削除済みとしてマークされていることがわかりました。ただし、私の理解では、代入演算子の右側にr値があるため、前述はコピー代入ではなく移動代入である必要があります。
この場合、strstr.str(someString)
代わりに使用するだけでおそらく解決できますが、このコンパイラエラーの原因にはまだ興味があります。ちなみにVC++では問題なくコンパイルできます。
c++ - スワップを使用して移動割り当てを実装する
完全に合理的だと思う何かが私に起こりましたが、何かが完全に欠けている場合に備えて、人々の意見を求めています. 最初に、私の理解でT& operator=(T&& rhs)
は、完了時にの内容が何であるかは気にせずrhs
、内容が移動されthis
、rhs
安全に破壊可能であるということです。
そうは言っても、スワップが安価であると仮定すると、コピー代入演算子の一般的な例外セーフ実装は次のようになります。
したがって、移動代入演算子を実装する 1 つの自然な方法は次のようになります。
しかし、それは私に起こりました、rhs
空である必要はありません! では、単にプレーンを実行してみませんswap
か?
これは、移動代入演算子が行う必要があることを満たしていると思います...しかし、私が言ったように、これは私に起こったので、何かが欠けている可能性があると思います.
私が考えることができる唯一の「欠点」this
は、move-construct/swap を実行するバージョンと比較して、単純なスワップを使用すると、所有するものが潜在的に長く存続することです。
考え?
c++ - デストラクタを定義すると、暗黙的に定義された移動代入演算子が削除されるのはなぜですか?
カスタマイズされたデストラクタが定義されているときに、暗黙的に定義された移動代入演算子を削除するという C++ 標準委員会の選択の背後にある理論的根拠は何ですか?