关于noexcept参数

Lor*_*ins 4 c++ c++11 c++14

noexcept对我来说,使用非常清楚,因为现代优化的标记函数的方式是无抛出异常保证

struct A {
    A() noexcept; 
}; 
Run Code Online (Sandbox Code Playgroud)

在有效的现代c ++的第14项中,我发现了以下语法,称为有条件的noexcept

template<class T, size_t N>
void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); 
Run Code Online (Sandbox Code Playgroud)

我得到它的方式是,它noexcept可以引入一个真值上下文,但是又如何另一个noexcept是一个参数?

有人可以详细说明这种用法的语法和语义noexcept吗?

Jar*_*d42 9

附:

template<class T, size_t N>
void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
                                  (1)      (2)
Run Code Online (Sandbox Code Playgroud)


Pra*_*han 5

关键字noexcept可以在两个上下文中使用:

  1. 将表达式作为参数并返回指示表达式是否为非抛出的noexcept运算符bool.
  2. 用于指定函数是否抛出的noexcept说明符.该形式可选地采用一个bool常量表达式来确定该函数是否noexcept存在.

在您粘贴的代码中,

noexcept    ( noexcept(swap(*a, *b)))
^^^^^^^^      ^^^^^^^^
specifier     operator
Run Code Online (Sandbox Code Playgroud)