2014-12-27 2 views
4

Использования noexcept было довольно ясно для меня, как современного оптимизированного способ маркировки функций с никакой гарантии, бросить исключениеНа noexcept аргументов

struct A { 
    A() noexcept; 
}; 

В пункте 14 из эффективных современных C++ Я ecountered следующий синтаксис, называемый условно noexcept

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

Способ, которым я получаю это, заключается в том, что noexcept может ввести контекст истинностного значения, но с другой стороны, как может другой noexcept быть аргументом?

Может ли кто-нибудь разработать синтаксис и семантику этого использования noexcept?

ответ

9

С:

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

Таким образом, оператор возвращает логическое значение, и может быть использован спецификатор. Thnx J –

5

Ключевое слово noexcept может быть использован в двух контекстах:

  1. noexcept operator, который принимает выражение в качестве аргумента и возвращает bool, указав, является ли выражение не металическим.
  2. noexcept specifier, который используется для указания, является ли функция броском или нет. Эта форма необязательно принимает одно постоянное выражение bool, которое определяет, является ли функция noexcept или нет.

В коде вы вставили,

noexcept (noexcept(swap(*a, *b))) 
^^^^^^^^  ^^^^^^^^ 
specifier  operator 
Смежные вопросы