問題タブ [copy-and-swap]
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++ - オーバーロードの参照渡し (左辺値と右辺値) が値渡しより優先されるのはいつですか?
operator=
C++ 11 では、同じ型のパラメーターを値で受け取るように書かれたものが、コピー代入演算子と移動代入演算子の両方として機能すると言われています。
代替案は、コードの繰り返しが多く、エラーの可能性がある 2 倍以上の行になります。
ref-to-const と r-value のオーバーロードが値渡しに適しているのはどのような状況ですか?それが必要になるのはいつですか? std::vector::push_back
たとえば、これは 2 つのオーバーロードとして定義されています。
値による受け渡しがコピー代入演算子および移動代入演算子として機能push_back
する最初の例に従って、標準で単一の関数として定義できませんでしたか?
c++ - コピーアンドスワップイディオムを使用して代入演算子でnoexceptを使用するには?
移動代入演算子は、多くの場合、noexcept として宣言する必要があります (つまり、型を STL コンテナーに格納するため)。しかし、copy-and-swap イディオムを使用すると、copy-代入演算子と move-代入演算子の両方を 1 つのコードで定義できます。この場合、noexcept 指定子をどうするか? コピー構造はスローできますが、noexcept 指定子に違反できるかどうかは疑問です。
c++ - 標準のコピーおよびスワップと互換性のない割り当ての移動
新しい移動セマンティクスのテスト。
Move Constructor で発生していた問題について質問しました。しかし、コメントで判明したように、問題は実際には、標準の「コピーとスワップ」イディオムを使用すると、「Move Assignment」演算子と「Standard Assignment」演算子が衝突することです。
これは私が使用しているクラスです:
かなり標準的だと思います。
次に、次のようにコードをテストしました。
ここで、への割り当てa
は「Move Assignment」演算子を使用する必要があります。ただし、「標準割り当て」演算子 (標準のコピーとスワップとして記述されます) との衝突があります。
「Standard Assignment」演算子を次のように変更することで、これを修正できます。
しかし、これは、コピーとスワップを最適化するコンパイラの機能を台無しにするため、良くありません。コピーアンドスワップイディオムとは何ですか? を参照してください。こことここ
それほど明白ではない何かが欠けていますか?
php - PHPで多次元配列の要素を交換する方法
私はphpを使用して配列に取り組んでおり、配列のアイテムを交換しようとしています。私はこのコードを持っています:
上記のコードの出力は次のとおりです。
出力が次のようになるように、配列のインデックスを交換しようとしています。
助けてくれてありがとう。
c++ - Copy-and-Swap Idiom は C++11 で Copy-and-Move Idiom になるべきですか?
この回答で説明されているように、コピー アンド スワップ イディオムは次のように実装されます。
operator= のパラメーターとして MyClass の値を持つことにより、コピー コンストラクターまたはムーブ コンストラクターのいずれかによってパラメーターを構築できます。その後、パラメーターからデータを安全に抽出できます。これにより、コードの重複が防止され、例外の安全性が向上します。
答えは、変数を一時的に交換または移動できることを示しています。主にスワッピングについて説明します。ただし、コンパイラによって最適化されていない場合、スワップには 3 つの移動操作が含まれ、より複雑なケースでは追加の作業が必要になります。必要な場合は、一時オブジェクトを割り当て先オブジェクトに移動するだけです。
オブザーバー パターンを含む、このより複雑な例を考えてみましょう。この例では、代入演算子のコードを手動で記述しました。move コンストラクター、代入演算子、swap メソッドに重点が置かれています。
明らかに、この手動で記述された代入演算子のコードの重複部分は、ムーブ コンストラクターの部分と同じです。代入演算子でスワップを実行すると動作は正しくなりますが、より多くの移動が実行され、余分な登録 (スワップ内) と登録解除 (デストラクタ内) が実行される可能性があります。
代わりに、ムーブ コンストラクターのコードを再利用する方がはるかに理にかなっているのではないでしょうか?
このアプローチは、スワップ アプローチよりも決して劣っていないように見えます。C++ 11 では、コピー アンド スワップ イディオムの方がコピー アンド ムーブ イディオムとして適していると考えるのは正しいですか、それとも何か重要なことを見逃していましたか?
exception - コピー アンド スワップは、C++11 で強力な例外を保証しますか?
コピー アンド スワップ イディオムは、強力な例外保証を提供すると言われています。しかし、C++11 では、std::swap は移動操作を使用します。
次のコードを検討してください。
throwingObject
スワップ中に がスローされると、強い例外の保証が破られます。
キーワードは、noexcept
コンパイル時に何も強制しません。throwingObject
まだスローできますが、唯一の違いは、プログラムが激しくterminate
. 例外が発生したときにアプリケーション全体をクラッシュさせることは、強力な例外保証とは見なされません。
これは、コピー アンド スワップが C++11 で強力な例外保証を強制しなくなったことを意味しますか?
類似の質問
この質問は似ていますが、標準ライブラリの使用を対象としています。コピー アンド スワップ イディオムの強力な例外保証にとって、この問題が何を意味するのかに興味があります。
この質問では、コピー アンド スワップ イディオムでの使用方法について説明しますnoexcept
が、コピーについてのみ説明します。問題があると思われるスワップではありません。
c++ - 移動セマンティクスはどのように「私のやり方」を改善しますか?
バックグラウンド
今日の初めに次の回答を読みましたが、文字通り C++ を再学習するように感じました。
次に、これらのエキサイティングな機能を使用する「方法」を変更する必要があるかどうかを考えました。私が抱えている主な関心事は、コードの効率と明確さです (前者は後者よりも少し重要です)。これは私をこの投稿に導きました:
私は強く反対します(答えに同意します、つまり)。ポインターを賢く使用しても、効率や明確さの点で移動セマンティクスが冗長になるとは思いません。
質問
現在、重要なオブジェクトを実装するときはいつでも、大まかに次のようにしています。
今日読んだ最初の 2 つの投稿から私が理解していることから、代わりにこれに変更することが有益であるかどうか疑問に思っています。
現在、少し複雑で冗長であることを除けば、2 番目の ( struct X
) によってパフォーマンスが向上する状況は見られません。また、読みにくくなっていることがわかります。私の 2 番目のコードがムーブ セマンティクスを正しく使用していると仮定すると、現在の「方法」をどのように改善できますか( struct Y
)?
注1:後者をより明確にする唯一の状況は、「機能から外れる」ことです
を使用する代替案を考えていstd::shared_ptr
ます。std::reference_wrapper
飽きたらget()
わずかに明確ではありませんが、効率的です。
注 2:私は、この質問を正確かつ回答可能なものにし、議論の対象にならないようにするために本当に努力しました。よく考えて、「なぜ移動セマンティクスが役立つのか」と解釈しないでください。これは私が求めていることではありません。