問題タブ [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++ - 移動割り当ては参照を壊しますか?
移動割り当てが変数 x のアドレスを変更できるかどうか、または自由に変更できるかどうか、および &x を格納するすべてのポインターと参照を無効にするかどうかがわかりません。デフォルトの移動割り当ては各メンバーを移動し、 this ポインターを保持するため、それは false だと思いますが、それは保証されていますか?
編集:例
c++ - 移動代入演算子を削除し、std コンテナーとの互換性を維持するにはどうすればよいですか?
特定のリソースを管理するための単純な RAII ラッパーがあります。インターフェースは次のとおりです。
std
ここでの問題は、move 代入演算子を明示的に削除するとすぐに、このクラスをコンテナーとアルゴリズムで使用できなくなることです。そして明らかに、難しい方法を学んだばかりなので、それを削除するか、適切に実装する必要があります。
別の方法として、通常の代入演算子を使用してムーブ代入を実装することもできますが、それを適切に行う方法がわかりません。のようなものが必要だと思いますstd::remove_reference
か?1 つの参照を削除しすぎて、不要な一時オブジェクトが作成されるのではないかと思います。
c++11 - 代入演算子の移動、コンストラクターの移動
私は 5 のルールを突き止めようとしてきましたが、オンラインの情報のほとんどは非常に複雑であり、サンプル コードは異なります。
私の教科書でさえ、このトピックをうまくカバーしていません。
移動中のセマンティクス:
私が理解しているように、テンプレート、右辺値、および左辺値は別として、移動セマンティクスは次のとおりです。
コピーとは対照的に、これは次のようなものと同等です。
右辺値、左辺値、またはテンプレートの説明は不要です。これらのトピックは無関係であると言えます。
最初の例が 2 番目の例よりも高速であるという事実は、当然のことです。また、C++ 11 より前の効率的なコードはすべてこれを行うことも指摘しておきます。
私の理解では、アイデアは、このすべての動作を標準ライブラリのきちんとした小さな演算子 move() にバンドルすることでした。
コピー コンストラクターとコピー代入演算子を記述するときは、単純に次のようにします。
同等のものは、次のようになります。
これがうまくいかないことは確かなので、私の質問は次のとおりです。移動セマンティクスを使用して、このタイプのコンストラクター機能をどのように実現しますか?
c++ - 移動コンストラクターが使用されていることを確認する方法
以下のコードでエラーが発生します。
これは、移動コンストラクターを指定することによってコピー コンストラクターが (意図的に) 暗黙的に削除され、ベクトルをコピーすると (削除された) コピー コンストラクターが呼び出されるために発生することがわかりました。ベクトルのコピーコンストラクターと代入演算子が使用される理由も理解できたと思います。ただし、移動コンストラクターと代入演算子を使用したいのは明らかです。オブジェクトを移動すると、オブジェクトに含まれるベクトルも移動します。では、移動コンストラクター/代入演算子でベクターの移動コンストラクター/代入演算子を使用するにはどうすればよいでしょうか?
コードは次のとおりです。
c++11 - C++ 11で移動コンストラクターが呼び出されるのはいつですか?
move コンストラクターが呼び出されない理由を理解できません。move constructor を呼び出す方法または構文が何であるかを誰でも教えてもらえますか。
出力:
Raw コピー 何か 何か 生 何もない デフォルト コピー 移動 代入 デストラクタ 何か デストラクタ デストラクタ デストラクタ デストラクタ
c++ - 同じオブジェクトをダブル移動すると、左から右にコピーされますか?
私はc ++ 11での移動操作の初心者なので、それで遊んでいます。しかし、私が理解できない何かを見つけました。
オブジェクトにb = std::move(a)
もう一度移動を適用しているため、操作が異なる動作をすることを期待していましたが、左側のオブジェクトbを右側のオブジェクトaにコピーしていますが、この部分はわかりません。
または、プログラミングで何か間違ったことをしました。移動操作で何か間違っている場合は助けてください。
編集:これは未定義の動作であることを知っています。私の疑問は、もう一度行う場合、オブジェクトaからオブジェクトbにコピーすることです。もう一度同じことを行う場合、オブジェクトbをオブジェクトaにコピーしますか?
したがって、フォームを左から右、右から左にコピーしているのはなぜですか?
c++ - 動的メモリを持つクラスの C++ ルール オブ ファイブ
だから私は動的なint配列を持つクラスのビッグファイブを書いています
私がこれまでに得たもの:
明らかに何か問題がありますが、私はビッグ 5 についてあまり詳しくありません...たくさん検索しましたが、それでも答えが見つかりませんでした...