はい、適切に使用すれば、どちらも同じことを行います。いいえ、std::iter_swap非推奨ではありません (標準の §D互換性機能セクションに配置されることにより)。MSDN の引用は、誤解を招くほど否定的です。std::swap問題は、適切に使用するのが不便なことです。
iter_swapより高い抽象化であるという単純な理由で使用する必要があります。
swap一般に、ユーザー定義型に対してオーバーロードされます。正しい呼び方は
using std::swap;
swap( blah, bleh );
単純ではない
std::swap( blah, bleh );
これは、§17.6.3.2、特に ¶3 に含まれています。
swap(t, u)およびが評価されるコンテキストでは、swap(u, t)「swap」という名前のバイナリ非メンバー関数が、以下を含む候補セットのオーバーロード解決 (13.3) を介して選択されることが保証されます。
— (20.2) でswap定義された 2 つの関数テンプレートと<utility>
— 引数依存ルックアップ (3.4.2) によって生成されるルックアップ セット。
iter_swapは特別なオーバーロードされた名前ではなく、その機能をカスタマイズするには、テンプレートの特殊化を に追加する必要がありnamespace std {}ます。
したがって、iter_swapそうでなければ毎回実装する Swappable インターフェースの一部を便利にカプセル化します。
実装とその特定の引数に意味上の違いがあるかどうかに関係なく、実際にはより使いやすいインターフェイスです。(潜在的な最適化を見逃す必要はありません。MSDN は意見を述べるかもしれませんが、ライブラリの作成者が「下位互換性インターフェイス」を使用して提供するものを予測することはできません。)
iter_swapとは明らかに異なる結果を伴うの特殊化に関してはswap( *a, *b )、それは要件 §25.3.3/5 に準拠していないように思われます。
効果: swap(*a, *b).
*aあなたが引用した例は、とへのポインターが*b操作の前後で両方とも有効であるため、観察可能な違いのように聞こえます。残念ながら、これはライブラリ実装のバグです。