繁体   English   中英

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

[英]What's the meaning of recursive 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 swap是noexcept
反过来,这决定了其他交换,例如Widget数组数组的交换是否为noexcept
类似地,交换包含Widget的两个std::pair对象是否为noexcept取决于Widget的交换是否为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM