我刚刚发现 basic_string 的两个交换函数(成员函数和命名空间 std 中的函数)没有用noexcept声明——既不是在 GCC-4.8 的标准库中,也不是在最新的 C++ 草案 N3690 中。
另一方面,移动构造函数和移动赋值运算符都用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
.