basic_string の 2 つのスワップ関数 (メンバー関数と名前空間 std の関数) が noexcept で宣言されていないことがわかりました。GCC -4.8 の標準ライブラリでも、最新の C++ ドラフト N3690 でもありません。
一方、move コンストラクターと move 代入演算子はnoexceptで宣言されています。これは、 noexceptスワップ関数を提供できるはずであることを示しています。
質問:スワップ関数がnoexceptで宣言されていない理由は何ですか?
更新:問題は、 static_assert を使用してスワップが実際にnoexceptであることを確認する、独自のスワップ関数内でテンプレート関数を使用したいことです。
struct foo {
bar_t bar;
baz_t baz;
void swap(foo& rhs) noexcept {
swap_noexcept(bar, rhs.bar);
swap_noexcept(baz, rhs.baz);
}
};
ただし、これはスワップ関数がnoexceptで宣言されている場合にのみ機能し、 の場合はそうではありませんbasic_string
。