それは判断の問題です。私は通常、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>
移動メンバーがなくても例外ではありません。