递归noexcept()的含义是什么?

Bir*_*abs 3 c++ noexcept

标准库定义了数组的交换,std::pair如下所示:

template <class T, size_t N>
void swap(T (&a)[N],
          T (&b)[N]) noexcept(noexcept(swap(*a, *b)));

template <class T1, class T2>
struct pair {
    …
    void swap(pair& p) noexcept(noexcept(swap(first,  p.first)) &&
                                noexcept(swap(second, p.second)));
    …
};
Run Code Online (Sandbox Code Playgroud)

有效的现代C++第14项说:

[...]它们是否noexcept取决于noexcept条款中的表达方式noexcept.
给定两个阵列Widget,例如,交换它们是noexcept仅当在阵列中交换单独的元件是noexcept,即,如果用于交换Widgetnoexcept.
即,反过来,确定其他互换,如一个用于数组的数组是否Widgetnoexcept.
类似地,交换std::pair包含Widgets的两个对象noexcept是否取决于Widgets的交换是否为noexcept.

但是根据这个解释,我无法理解为什么有必要将呼叫嵌套为noexcept(noexcept(swap(*a, *b))).

如果目标是"交换两个数组应该noexcept像交换元素一样",为什么还noexcept(swap(*a, *b))不够?

这些不同的重载是noexcept()什么?

Vit*_*meo 9

这不是"递归的" noexcept,noexcept关键字只有两种用途:

  • noexcept说明符 - 将函数标记为noexcept并且可选地将布尔常量表达式作为参数

  • noexcept操作者 -它接受一个表达式作为参数,并返回一个布尔常量表达式表示是否表达noexcept


在你的情况下:

//          `noexcept` operator
//          v~~~~~~~~~~~~~~~~~~~~~
   noexcept(noexcept(swap(*a, *b)))
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// `noexcept` specifier
Run Code Online (Sandbox Code Playgroud)