2013-03-30 13 views
24

Sono un po 'confuso con i distruttori e noexcept. La mia comprensione è stata che in C++ 11 qualsiasi distruttore, incluso definito dall'utente, è implicitamente noexcept(true), anche se abbiamo throw da esso. E si deve specificare esplicitamente noexcept(false) se vogliono che sia così per qualche motivo.Destructors e n. Eccetto

Quello che sto vedendo è che al contrario - con GCC 4.7.2, il distruttore definito dall'utente, non importa quanto primitiva sia la classe e il distruttore, è implicitamente noexcept(false). Cosa mi manca qui? C'è qualche trucco nascosto con i distruttori definiti dall'utente?

+4

12,4/3: "Una dichiarazione di un distruttore che non ha una specifica delle eccezioni è implicitamente considerata per avere la stessa specifica di eccezione di una dichiarazione implicita (15.4). " cioè un distruttore è solo "noexcept (true)" se tutti i membri e le basi hanno un distruttore no-outs. – ipc

risposta

16

Questo è un known bug (crediti all'OP per la ricerca del bug report), e sembra che sia stato corretto in GCC 4.8.0. Per esempio, l'affermazione statica sotto scatterà il GCC 4.7.2, ma non su GCC 4.8.0:

struct X 
{ 
    ~X() { }; 
}; 

int main() 
{ 
    X x; 

    // This will not fire even in GCC 4.7.2 if the destructor is 
    // explicitly marked as noexcept(true) 
    static_assert(noexcept(x.~X()), "Ouch!"); 
} 
+3

In realtà non pensavo di usare "bug" come parola chiave di ricerca aggiuntiva. Ora che l'ho fatto (grazie a te) è venuto fuori [Bug 56191] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56191). Grazie per la pronta risposta! – lapk

+0

@PetrBudnik: Grazie per il collegamento, lo aggiungerò alla risposta! –

Problemi correlati