标准库定义了数组的交换,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,即,如果用于交换Widget是noexcept.
即,反过来,确定其他互换,如一个用于数组的数组是否Widget是noexcept.
类似地,交换std::pair包含Widgets的两个对象noexcept是否取决于Widgets的交换是否为noexcept.
但是根据这个解释,我无法理解为什么有必要将呼叫嵌套为noexcept(noexcept(swap(*a, *b))).
如果目标是"交换两个数组应该noexcept像交换元素一样",为什么还noexcept(swap(*a, *b))不够?
这些不同的重载是noexcept()什么?
这不是"递归的" noexcept,noexcept关键字只有两种用途:
noexcept说明符 - 将函数标记为noexcept并且可选地将布尔常量表达式作为参数
noexcept操作者 -它接受一个表达式作为参数,并返回一个布尔常量表达式表示是否表达是noexcept
在你的情况下:
// `noexcept` operator
// v~~~~~~~~~~~~~~~~~~~~~
noexcept(noexcept(swap(*a, *b)))
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// `noexcept` specifier
Run Code Online (Sandbox Code Playgroud)