37

私はただ疑問に思っていました、なぜ誰かがこれを書くのでしょうか:

std::iter_swap(i, k);

これの代わりに?

std::swap(*i, *k);   // saved a few keystrokes!

それから私はの実装を調べました、そしてiter_swapもちろん、とにかく、私たちがすでに入っているので、swap代わりにそれだけを使用します。それは私を次の質問に導きます:std::swapnamespace std

なぜ誰かがこれを書くのでしょうか:

using std::swap;
swap(a, b);

これの代わりに?

std::iter_swap(&a, &b);   // saved an entire line of code!

ここで見落としている重要な違い/問題はありますか?

4

2 に答える 2

37

SGIドキュメント(ここ)から:

[1]厳密に言えば、iter_swapは冗長です。これは技術的な理由でのみ存在します。状況によっては、swap(* a、* b)の解釈に必要な型の推定を実行するのが難しいコンパイラもあります。

于 2012-12-21T14:28:41.153 に答える
12

2番目の質問に答えるために、using+swapを使用すると、コンパイラーは、デフォルトの実装(ADLを使用)よりも効率的なユーザー定義のスワップ関数を使用できます。明示的に言うとstd::swap、ADLおよびADLが検出できた可能性のあるカスタムスワップメソッドが禁止されます。

おそらくそれはテンプレートで使用するためiter_swapのものであり、ポインタを期待していることを示す可能性のあるスワップではなく、意図を明確に示しています。

于 2012-12-21T14:37:26.357 に答える