Supponiamo che io sono:Qual è la specifica di eccezione per un distruttore virtuale predefinito in C++ 11?
class Foo
{
public:
virtual ~Foo()=default;
};
Qual è la specifica delle eccezioni sul distruttore in default? È il distruttore in default pari a:
virtual ~Foo() {};
or
virtual ~Foo() throw() {};
or
virtual ~Foo() noexcept {};
Sezione 15.4 dello standard C++ 11 dice che dipende dalle specifiche di eccezione delle funzioni direttamente invocate dai definizione implicita del distruttore. In questo caso non ci sono membri e non ci sono classi base, quindi AFAIK non ci sono funzioni invocate direttamente dal distruttore implicito. Questa è un'ambiguità (o omissione) nello standard?
Importa, ovviamente, perché se implicitamente ha throw(), tutte le sottoclassi devono dichiarare i loro distruttori con throw(). Non dirmi che è una cattiva idea gettare eccezioni nei distruttori, lo so. Mi occupo di un sacco di codice legacy in cui le specifiche delle eccezioni non sono state usate affatto.
Come punto di informazioni, quando ho provato:
class SubFoo : public Foo
{
public:
virtual ~SubFoo();
};
ho ottenuto un errore (spec eccezione non corrispondenti) in GCC 4.4 (anche se ammetto io non ho avuto passa la linea di comando a destra), ma non in XCode 4.3 usando i compilatori "11".
Grazie per la risposta. Per seguire un po 'di più, la specifica dice "Una dichiarazione di un distruttore che non ha una specifica di eccezione è implicitamente considerata avere la stessa specifica di eccezione di una dichiarazione implicita" Quindi "virtual ~ SubFoo();" (senza un'eccezione spec) non è mal formata, a meno che non invochi direttamente funzioni che implicitamente o esplicitamente permettono di lanciare? – user1414050
@ user1414050: Credo che sia corretto, sì - ma noi " rientrando in angoli abbastanza oscuri del linguaggio che non avrei scommesso molto sulla maggior parte dei compilatori per farlo nel modo giusto. In particolare, sospetto che molti (la maggior parte?) compilatori trattino 'virtual ~ SubFoo();' come significato "può lanciare qualsiasi cosa ", proprio come farebbe con una funzione normale. –
Penso che questa conclusione non regge, dal momento che il" se e solo se "è contraddetto dalla seguente frase-frase su allowin tutte le eccezioni (ad esempio, lo standard è auto-contraddittorio qui). E penso che sia discutibile se l'intenzione è che i distruttori non abbiano il lancio di default. Perché sarebbe incompatibile con C++ 03. –