swap
関数テンプレートは、C++0xでからに移動されました<algorithm>
。<utility>
前者には後者がC++0xに含まれていますか?または、両方に定義する共通のヘッダーが含まれていますswap
か?
言い換えれば、次のコードはC ++ 0xでコンパイルされることが保証されていますか?
#include <algorithm> // will this pull in std::swap?
// ...
using std::swap;
swap(a, b);
swap
関数テンプレートは、C++0xでからに移動されました<algorithm>
。<utility>
前者には後者がC++0xに含まれていますか?または、両方に定義する共通のヘッダーが含まれていますswap
か?
言い換えれば、次のコードはC ++ 0xでコンパイルされることが保証されていますか?
#include <algorithm> // will this pull in std::swap?
// ...
using std::swap;
swap(a, b);
FDIS (n3290) の附属書 C、「互換性」、C.2.7 は次のように述べています。
17.6.3.2
元の機能への影響: 関数スワップが別のヘッダーに移動
根拠: スワップの <algorithm> への依存を削除します。
元の機能への影響: スワップが <algorithm> にあると想定してコンパイルされた有効な C++ 2003 コードは、代わりに <utility> を含める必要がある場合があります。
いいえ、コンパイルが保証されているわけではありません。これは意図的に重大な変更です。個々の実装が実際に C++03 コードを壊すかどうかは別の問題です。swap
あなたが指摘するように、どちらかのヘッダーを介して定義することで、そうしないのは簡単です。しかし、C++03 コードを C++0x に移植しやすくするか、厳密に準拠した C++0x を書くのを助けるか、どちらかの選択肢があります。