为什么全局交换函数使用了两次 noexcept

Inf*_*ity 4 c++ noexcept c++11

我正在尝试理解noexcept。我发现全局交换函数通常是这样指定的

void swap (T& x, T& y) noexcept(noexcept(x.swap(y)))
{
   x.swap(y);
}
Run Code Online (Sandbox Code Playgroud)

我想了解为什么 noexcept 规范是noexcept(noexcept(x.swap(y)))但不是noexcept(x.swap(y))

son*_*yao 6

这是 的两种用法noexcept

如果声明不抛出异常,则使用的noexcept 运算符noexcept(x.swap(y))返回,否则返回。truex.swap(y)false

它可以在函数模板的 noexcept 说明符中使用,以声明该函数将引发某些类型的异常,但不会引发其他类型的异常。

noexcept说明符用于指定函数是否可以抛出异常。根据 的结果noexcept(noexcept(x.swap(y)))指定是否抛出;即能否抛出取决于能否抛出。swapnoexcept(x.swap(y))swapx.swap(y)