![](/img/trans.png)
[英]What's the difference between the noexcept keyword and _NOEXCEPT macro?
[英]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.