С++ ISO noexcept noexcept

В стандарте C++ есть следующее определение:

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

Что делает noexcept(noexcept(swap(*a, *b)))?

Ответ 1

Наличие спецификатора noexcept(x) в объявлении функции означает, что функция не металирования тогда и только тогда, когда x оценивает значение true.

noexcept(y) также может использоваться как оператор, оценивая значение true если y является небрасывающим выражением, и false если y может потенциально выбросить.

В сочетании это означает void foo() noexcept(noexcept(y)); означает: foo не бросает точно, когда y не бросает.

В данном случае вопроса, функция шаблон swap для массивов объявляются не метание, если и только если замена отдельных членов массивов не является бросанием, что имеет смысл.