标准库定义数组的交换和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)));
…
};
有效的现代C ++第14项说:
[...]它们是
noexcept
取决于noexcept
子句中的表达式是noexcept
。
例如,给定两个Widget
数组,仅当交换数组中的单个元素为noexcept
时,交换它们才是noexcept
,即Widget
的交换是noexcept
}。
反过来,这又决定了其他交换,例如Widget
数组的转换是noexcept
。 同样,交换包含std::pair
的两个Widget
对象的noexcept
是否取决于Widget
s的交换是noexcept
。
但是从这个解释中,我无法理解为什么有必要将呼叫嵌套为noexcept(noexcept(swap(*a, *b)))
。
如果目标是“将两个数组交换为noexcept
作为交换元素”,为什么noexcept(swap(*a, *b))
不足以满足要求?
这些不同的重载是noexcept()
还是什么?
答案 0 :(得分:9)
这不是“递归”noexcept
,noexcept
关键字只有两种用途:
noexcept
specifier - 将函数标记为noexcept
,并可选择将布尔常量表达式作为参数
noexcept
operator - 将表达式作为参数并返回布尔常量表达式,表示表达式是否是noexcept
在你的情况下:
// `noexcept` operator
// v~~~~~~~~~~~~~~~~~~~~~
noexcept(noexcept(swap(*a, *b)))
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// `noexcept` specifier