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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top