Будет ли std:: swap по-прежнему определяться включением алгоритма в С++ 0x?

Шаблон функции swap был перемещен из <algorithm> в <utility> в С++ 0x. Включает ли первое из последних в С++ 0x? Или оба они включают общий заголовок, который определяет swap?

Другими словами, следующий код гарантирован для компиляции в С++ 0x?

#include <algorithm>   // will this pull in std::swap?

// ...

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

Ответ 1

FDIS (n3290), в Приложении C, "Совместимость", C.2.7 говорит:

17.6.3.2

E ff ect по оригинальной функции: обмен по функциям перемещен в разное header

Обоснование: удалить зависимость от <algorithm> для обмена.

E ff ect on оригинальная функция: действительный код С++ 2003, который был скомпилирован, ожидая swap, чтобы быть в < алгоритме > возможно, придется включать <utility> .

Так что нет, это не гарантируется, чтобы скомпилировать, это намеренно является нарушением изменений. Независимо от того, будут ли отдельные реализации фактически нарушать код С++ 03, это другое дело. Как вы указываете, достаточно легко для них не делать этого, определяя swap через любой заголовок. Но есть выбор между тем, чтобы упростить перенос кода С++ 03 на С++ 0x, и помогая людям писать строго соответствующие С++ 0x.