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

What's the meaning of recursive noexcept()?

本文关键字:是什么 noexcept 递归      更新时间:2023-10-16

标准库定义了数组的交换,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时,即如果交换Widgetnoexcept,交换它们才noexcept
这反过来又决定了其他交换,例如Widget数组数组的交换是否noexcept
同样,交换两个包含Widgets 的std::pair对象是否noexcept取决于交换Widgets 是否noexcept

但是从这个解释中,我不明白为什么有必要将调用嵌套为noexcept(noexcept(swap(*a, *b)))

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

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

这不是"递归"noexceptnoexcept关键字只有两种用法:

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

  • noexcept运算符 - 将表达式作为参数并返回一个布尔常量表达式,表示表达式是否noexcept


在您的情况下:

//          `noexcept` operator
//          v~~~~~~~~~~~~~~~~~~~~~
noexcept(noexcept(swap(*a, *b)))
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// `noexcept` specifier