我刚发现基本字符串的两个交换函数(成员函数和std名称空间中的函数)都没有用noexcept声明——无论是在GCC-4.8的标准库中还是最新的C++草案N3690中。
另一方面,移动构造函数以及移动赋值运算符却被声明为noexcept。这表明应该可以提供支持noexcept的swap函数。
问题:为什么没有将swap函数声明为noexcept?
更新:问题在于我想在自己的swap函数中使用一个模板函数,该函数使用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
就不是这种情况。
basic_string<>::swap
的规范确实声明了_Throws: Nothing._ - K-ballo