Specificando noexcept(true)
, si afferma che la funzione non genera mai eccezioni. Specificando noexcept(false)
o non specificando nulla, non si afferma che la funzione non genera mai eccezioni.
Quindi è fondamentalmente la tua dichiarazione (2), ma nota che per il compilatore, è equivalente alla tua istruzione (1). Se il compilatore non ha la certezza che la funzione non verrà lanciata, deve presumere che possa farlo.
Il bit corrispondente della norma è C++ 11 15,4/12:
Una funzione senza specifica delle eccezioni o con un specifica delle eccezioni della forma noexcept(constant-expression)
dove la costante -expression rese false
consente tutte le eccezioni. Un specifica delle eccezioni è non gettando se di forma throw()
, noexcept
o noexcept(constant-expression)
dove i costante espressione rendimenti true
. Una funzione con una specifica di eccezione senza lancio non consente eccezioni.
Ci sono solo due deviazioni da quella regola. Uno è i distruttori — che non specifica alcuna eccezione su un distruttore conferisce al distruttore la stessa specifica di eccezione di quella che avrebbe generato il default. Cioè, noexcept(true)
se e solo se tutte le funzioni che verrebbero invocate direttamente dal distruttore generato in modo predefinito sono noexcept(true)
.
L'altro è le funzioni di deallocation (operator delete
) — una funzione di deallocazione senza una specifica di eccezione esplicita viene considerata come noexcept(true)
.
Se si prende 'noexcept (false)' per essere l'opposto di 'noexcept (true)', [un riferimento] (http://en.cppreference.com/w/cpp/language/noexcept_spec) risponde a tutto. – chris