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

时间:2018-05-24 11:36:42

标签: 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)));
    …
};

有效的现代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()还是什么?

1 个答案:

答案 0 :(得分:9)

这不是“递归”noexceptnoexcept关键字只有两种用途:

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

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

在你的情况下:

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