21

我刚刚发现 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.

4

1 回答 1

20

C++11 标准的第 21.4.6.8 段规定:

21.4.6.8 basic_string::swap[字符串::交换]

void swap(basic_string& s);

1后置条件:*this 包含与 s 中相同的字符序列,s 包含与 *this 中相同的字符序列。

2次投掷:什么都没有。

3复杂性:恒定的时间。

因此,必须得出结论,缺少noexcept是一种疏忽。

assign()关于成员函数的第 21.4.6.3 段给出了另一个线索:

basic_string& assign(basic_string&& str) noexcept;

效果:该函数将由 控制的字符串替换*this为长度为 的字符串,str.size()其元素是由 控制的字符串的副本str。[注意:一个有效的实现是swap(str). ——尾注]

3回报*this.

如果swap(str)应该是 的有效实现assign(),并且assign()被标记为无条件,那么假设也是noexcept有意义的。swap()noexcept

于 2013-05-18T23:02:03.757 回答