c++ - destructores - ¿Cuál es la diferencia entre el destructor "= predeterminado" y el destructor vacío?
delete c++ (1)
Quiero evitar que el usuario de mi clase lo use como una variable automática, por lo que escribo un código como este:
class A {
private:
~A() = default;
};
int main() {
A a;
}
Espero que el código no se compile, pero g ++ lo compila sin error.
Sin embargo, cuando cambio el código a:
class A {
private:
~A(){}
};
int main() {
A a;
}
Ahora, g ++ da el error de que ~A()
es privado, como lo es mi expectativa.
¿Cuál es la diferencia entre un destructor "= predeterminado" y un destructor vacío?
Tu primer ejemplo no debe compilar. Esto representa un error en el compilador que compila. Este error se corrige en gcc 4.9 y versiones posteriores.
El destructor definido con = default
es trivial en este caso. Esto se puede detectar con el valor std::is_trivially_destructible<A>::value
.
Actualizar
C ++ 11 (y C ++ 14) indican que si uno tiene un destructor declarado por el usuario (y si no tiene ninguno de los miembros especiales de movimiento declarados por el usuario), la generación implícita del constructor de copia y el operador de asignación de copia Todavía sucede, pero ese comportamiento está en desuso. Es decir, si confía en ello, su compilador podría darle una advertencia de desaprobación (o no).
Ambos:
~A() = default;
y:
~A() {};
son declarados por el usuario , por lo que no tienen ninguna diferencia con respecto a este punto. Si usa cualquiera de estos formularios (y no declara miembros de movimiento), debe predeterminar explícitamente, eliminar explícitamente o proporcionar explícitamente a sus miembros copiados para evitar depender de comportamientos desaprobados.
Si declara mover miembros (con o sin declarar un destructor), entonces los miembros de la copia se eliminan implícitamente.