Voglio evitare che l'utente della mia classe di utilizzarlo come una variabile automatica, quindi mi scrivere codice come questo:Qual è la differenza tra il distruttore "= default" e il distruttore vuoto?
class A {
private:
~A() = default;
};
int main() {
A a;
}
mi aspetto che il codice non sarà compilato, ma g ++ compila senza errori .
Tuttavia, quando cambio il codice per:
class A {
private:
~A(){}
};
int main() {
A a;
}
Ora, g ++ dà l'errore che ~A()
è privato, come è la mia aspettativa.
Qual è la differenza tra un distruttore "= predefinito" e un distruttore vuoto?
Quale versione di gcc? –
Lettura ad es. [questo riferimento del distruttore] (http://en.cppreference.com/w/cpp/language/destructor), la differenza è che un distruttore fornito dall'utente (anche se è vuoto) è * non banale *, e dal reference: "Gli oggetti con distruttori banali non richiedono un'espressione delete e possono essere eliminati semplicemente trasferendo la loro memoria." –
Nel tuo caso non c'è differenza, sia [gcc4.9 che clang3.5 rifiutano di compilare] (http://coliru.stacked-crooked.com/a/41976bc03bc12c79) il tuo primo esempio. Deve essere un bug nella tua versione di gcc. – Praetorian