2015-04-21 11 views
16

Se contrassegno una funzione come noexcept(false) o qualsiasi altra espressione che restituisce false, che cosa significa? (1) sto assicurando al compilatore che la funzione può generare un'eccezione ?, (2) o sto garantendo nulla sul fatto che possa generare eccezioni o no?C++ omettendo l'identificatore `noexcept` contro` noexcept (false) `, qual è il loro significato preciso?

Infine, se ometto lo specificatore noexcept, è equivalente a noexcept(false) o equivalente al (2) nd significato sopra indicato?

+0

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

risposta

16

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).

+1

@Deduplicator Modificata la dicitura relativa alle funzioni, ma non riesco a trovare un riferimento ai costruttori che si comportano allo stesso modo. Puoi fornire un numero di paragrafo? – Angew

+1

@Deduplicator Solo se non è fornito dall'utente (vale a dire, implicitamente dichiarato o esplicitamente predefinito alla prima dichiarazione). Vedi [dcl.fct.def.default]/p2, [except.spec]/14. –

+0

Hai perso anche le funzioni di deallocazione, che sono di default 'noexcept (true)'. –

8

omissione del noexcept specificatore è equivalente a noexcept(false), tranne distruttori, dove omettendo l'identificatore significa lasciare il compilatore dedurre dai membri e classi base.

Problemi correlati