それは判断の問題です。私は通常、std::swapコードのプロトタイピングの仕事をさせますが、リリースコードの場合はカスタムスワップを作成します。私は通常、1つの移動構築+2つの移動割り当て+1つのリソースレス破壊の約2倍の速度のカスタムスワップを作成できます。std::swapただし、実際にパフォーマンスの問題であることが判明するまで待ってから、面倒な作業を行うことをお勧めします。
Alf P. Steinbachの更新:
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です。
この仕様では、メンバーの移動は必要ありません。右辺値からの構築と割り当てが存在することだけが必要であり、存在する場合noexcept、スワップはになりますnoexcept。例えば:
class A
{
public:
A(const A&) noexcept;
A& operator=(const A&) noexcept;
};
std::swap<A>移動メンバーがなくても例外ではありません。