C++ 什么';递归noexcept()的含义是什么?

C++ 什么';递归noexcept()的含义是什么?,c++,noexcept,C++,Noexcept,标准库为数组和std::pair定义了交换,如下所示: 模板 无效掉期(T&a)[N], T&b[N])无例外(无例外(掉期(*a,*b)); 模板 结构对{ … 无效掉期(配对和p)无例外(无例外(掉期(第一,p.first))&& 无例外(掉期(第二,p.second)); … }; 有效的现代C++项目14表示: […]它们是否为noexcept取决于noexcept子句中的表达式是否为noexcept 例如,给定两个Widget数组,仅当数组中的单个元素交换为noexcept时,交换它

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

模板
无效掉期(T&a)[N],
T&b[N])无例外(无例外(掉期(*a,*b));
模板
结构对{
…
无效掉期(配对和p)无例外(无例外(掉期(第一,p.first))&&
无例外(掉期(第二,p.second));
…
};
<>有效的现代C++项目14表示:

[…]它们是否为
noexcept
取决于
noexcept
子句中的表达式是否为
noexcept

例如,给定两个
Widget
数组,仅当数组中的单个元素交换为
noexcept
时,交换它们才是
noexcept
,即如果交换
Widget
noexcept
这反过来决定了其他交换,例如用于
小部件
的数组的交换,是否是
无例外

类似地,交换两个
std::pair
对象(包含
Widget
s)是否为
noexcept
取决于交换
Widget
s是否为
noexcept

但是从这个解释中,我无法理解为什么需要将调用嵌套为
noexcept(noexcept(swap(*a,*b))

如果目标是“将两个数组交换为
noexcept
交换元素”,为什么
noexcept(swap(*a,*b))
不够

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

这不是“递归的”
noexcept
noexcept
关键字有两种用法:

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

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


就你而言:

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

如果,我想应该将说明符重命名为
noexcept\u。