2012-08-15 17 views
10

Il C++ 11 fornisce garanzie circa le funzioni o i metodi inline quando eseguono chiamate ad altre funzioni dichiarate con il qualificatore noexcept?C++ 11 qualificatore e metodi inline noex

class My_String { ... 

    const char * c_str() const noexcept; 
    inline operator const char *() const { return c_str(); } 
}; 

I assumere un compilatore ottimizzato sarebbe libera di implementare il metodo in linea senza la piena EH e impilare svolgimento, come per la qualificazione noexcept. Mi aspetterei anche questo per un semplice metodo di accesso troppo:

... inline operator const char *() const { return m_buffer; } 

Mentre questo esempio sembra banale, fatta eccezione garantisce importa quando utilizzato per implementare altre classi o funzioni. Q: Lo standard C++ 11 indirizza questo o dovrebbe essere contrassegnato con i metodi in linea noexcept? O è meglio omettere lo noexcept a meno che lo non contenga lo per corrispondere a una specifica di classe o funzione?

Modifica: Per evitare qualche confusione: è noexcept implicito per il metodo inline?

+1

Per il codice fornito dall'utente, 'noexcept' è solo implicito per i distruttori, come una risposta semplice. –

+2

una domanda successiva è: ** si dovrebbe dichiarare 'noexcept' quando possibile? ** – Walter

risposta

8

Siamo spiacenti, no. Le uniche eccezioni implicite sono

  • Su distruttori.
  • Su altre funzioni membro speciali implicitamente dichiarate o esplicitamente predefinite: costruttori predefiniti, costruttori di copia e spostamento e copia e sposta assegnazione, se non dichiarati in una definizione di classe, o dichiarati con = default;.
  • Nelle funzioni di deallocazione: operator delete e operator delete[].

Pertanto, con la dichiarazione di esempio, noexcept(static_cast<const char*>(std::declval<const MyString>())) deve essere false. Vai avanti e scrivi noexcept dove potrebbe importare.

Naturalmente, come è stato notato, l'ottimizzazione del compilatore può ancora notare che una funzione inline non può generare eccezioni e semplificare la gestione delle eccezioni nel chiamante.

+1

Nell'elenco di * implicito' noexcept' * manca che i distruttori che vengono utilizzati dichiarati/definiti siano implicitamente "noxcept" a meno che il l'utente ha fornito una specifica di eccezione diversa. Questa è una deviazione di C++ 11 dal comportamento di C++ 03. Cioè, un utente ha dichiarato distruttore come 'T :: ~ T() {throw 1; } 'terminerà il programma anche se nessuna altra eccezione è attiva (notare la mancanza delle specifiche delle eccezioni) –

+0

Mi è mancato durante la scansione dello standard, grazie. – aschepler

+1

Perse anche nella risposta originale: i membri speciali esplicitamente predefiniti agiscono come se fossero dichiarati implicitamente. – aschepler