Inizialmente ho pubblicato questo come una domanda solo sui distruttori, ma ora sto aggiungendo considerazione sul costruttore predefinito. Ecco la domanda originale:
Se voglio dare alla mia classe un distruttore virtuale, ma altrimenti uguale a quello che genererebbe il compilatore, posso usare
=default
:class Widget { public: virtual ~Widget() = default; };
Ma sembra che posso ottenere lo stesso effetto con meno digitazioni usando una definizione vuota:
class Widget { public: virtual ~Widget() {} };
Esiste un modo in cui queste due definizioni si comportano diversamente?
Sulla base delle risposte pubblicate per questa domanda, la situazione per il costruttore predefinito sembra simile. Dato che non vi è quasi alcuna differenza di significato tra " =default
" e " {}
" per i distruttori, allo stesso modo non esiste alcuna differenza di significato tra queste opzioni per i costruttori predefiniti? Cioè, supponendo che io voglia creare un tipo in cui gli oggetti di quel tipo saranno sia creati che distrutti, perché dovrei dire
Widget() = default;
invece di
Widget() {}
?
Mi scuso se l'estensione di questa domanda dopo la sua pubblicazione originale sta violando alcune regole SO. Pubblicare una domanda quasi identica per i costruttori predefiniti mi è sembrata l'opzione meno desiderabile.
std::has_trivial_destructor<Widget>::value
vale true
per il primo, ma false
per il secondo. Quali siano le implicazioni di ciò non lo so neanche io. :)
= default
è più esplicito imo, ed è coerente con il supporto per esso con i costruttori.