La llamada pseudo-destructor no destruye un objeto
-
20-12-2019 - |
Pregunta
Considere el siguiente código:
#include <iostream>
typedef int t;
t a=42;
int main()
{
a.t::~t();
std::cout << a; //42
}
Esperaba que se destruya a
.Pero no es cierto, ¿por qué?¿Cómo se destruirá esa llamada pseudo-destructor?
Solución
Pero no es cierto, ¿por qué?
§5.2.4 / 1:
El único efecto es la evaluación de la expresión posfix antes del punto o la flecha.
Cuando la expresión posfix es la expresión del objeto para el que se lleva a cabo la llamada. Por lo tanto, una llamada pseudo destructor, como llamada a un destructor trivial, no termina la vida útil del objeto en el que se aplica. Por ejemplo,
int i = 0;
(i += 5).~decltype(i)();
std::cout << i;
No se puede llamar a un destructor para escalares, porque no tienen uno (ver [Class.dtor]). La declaración se permite únicamente para el código de plantilla en el que llame al destructor de un objeto cuyo tipo que no conoce, elimina la necesidad de escribir una especialización para los tipos escalares.
Se observó en los comentarios que [Expr.Pseudo] implica la existencia de un destructor para escalares por
El uso de un nombre Pseudo-destructor después de un Operador de DOT GENCODICETAGETGODEDODEDODOTEDIGNETGOTEDOTE ORWERACODICETGCODE representa el destructor para el tipo de no clase nombrado por tipo nombre .
Sin embargo, esto es inconsistente con otras partes de la norma, por ejemplo. §12, que llama a un destructor una función de miembro especial y menciona que
Se usa un destructor para destruir objetos de su tipo de clase.
Parece ser una imprecisión creada en C ++ 98 días.