【发布时间】:2013-05-13 20:14:57
【问题描述】:
我刚刚发现 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 则不是这样。
【问题讨论】:
-
也许这只是一个疏忽。
basic_string<>::swap的规范确实声明 Throws: Nothing.