1

ここで: http://en.m.wikipedia.org/wiki/Rule_of_three_(C++_programming)

/** Copy Assignment Operator */ 
Foo& operator= (const Foo& other) { 
  Foo temporary (other); 
  std::swap (data, temporary.data); 
  return *this;
 }

例ではstd::swap、データを一時的なものと交換するために使用します。なぜテンポラリーとスワップを作成するのでしょうか? コピペした方が早くない?私も他の場所でこれを見て、混乱しました。

4

3 に答える 3

5

スワップ トリックは、例外の安全性を確保するかなり簡単な方法です。

フィールドごとのコピーを実行し、途中で例外が発生した場合、オブジェクトは一貫性のない状態になる可能性があります (これに対処するための措置を講じない限り、事態がかなり複雑になる可能性があります)。

スワップベースの実装では、Foo temporary (other)スローされた場合、オブジェクトは元の状態から変更されません。

于 2013-11-09T19:29:44.770 に答える
1

さらに、コピー省略と (c++11) 移動セマンティクスを有効にするには:

Foo& operator= (Foo other) { 
  std::swap(data, other.data); 
  return *this;
}
于 2013-11-09T19:39:27.420 に答える
0

これは、矛盾した状態を回避するため、またはより適切な言葉で言えば、例外を安全にするためです。

この関連スレッドも確認してください。-コピー アンド スワップ イディオムとは何ですか?

上記のスレッドでGManNickGが述べたように:-

これは、コピー コンストラクターの機能を使用してデータのローカル コピーを作成し、コピーされたデータを swap 関数で取得して、古いデータを新しいデータと交換することによって機能します。その後、一時コピーは破棄され、古いデータが取り込まれます。新しいデータのコピーが残ります。

コピー アンド スワップのイディオムを使用するには、3 つのものが必要です。動作するコピー コンストラクタ、動作するデストラクタ (どちらもラッパーの基礎であるため、いずれにせよ完全である必要があります)、およびスワップ関数です。

スワップ関数は、クラスの 2 つのオブジェクト (メンバーとメンバー) を交換するスローしない関数です。独自のものを提供する代わりに std::swap を使用したくなるかもしれませんが、これは不可能です。std::swap はその実装内でコピー コンストラクターとコピー代入演算子を使用します。最終的には代入演算子をそれ自体で定義しようとします!

また、なぜ一部の人が移動割り当てにスワップを使用するのですか?も確認してください。

于 2013-11-09T19:32:51.103 に答える