Это вопрос суждения.Обычно я позволяю std::swap
выполнять работу для прототипирования кода, а для кода выпуска пишите пользовательский своп.Обычно я могу написать собственный своп, который примерно в два раза быстрее, чем 1 ход строительства + 2 задания хода + 1 безресурсное уничтожение.Однако, возможно, стоит подождать, пока std::swap
действительно окажется проблемой производительности, прежде чем переходить к беспокойству.
Обновление для Альфа П. Штейнбаха:
20.2.2 [utility.swap] указывает, что std::swap(T&, T&)
имеет noexcept
, эквивалентный:
template <class T>
void
swap(T& a, T& b) noexcept
(
is_nothrow_move_constructible<T>::value &&
is_nothrow_move_assignable<T>::value
);
Т.е. если операции перемещения на T
равны noexcept
, то std::swap
на T
noexcept
.
Обратите внимание, что эта спецификация не требует перемещения членов.Требуется только, чтобы существовала конструкция и присваивание из значений rvalue, и если это noexcept
, то swap будет noexcept
.Например:
class A
{
public:
A(const A&) noexcept;
A& operator=(const A&) noexcept;
};
std::swap<A>
не исключено, даже без перемещения членов.