La llamada al pseudo destructor no destruye un objeto

Considera el siguiente código:

#include  typedef int t; ta=42; int main() { at::~t(); std::cout << a; //42 } 

Se espera que a será destruido. Pero no es verdad, ¿por qué? ¿Cómo se destruirá el objeto esa llamada pseudo-destructor?

Pero no es verdad, ¿por qué?

§5.2.4 / 1:

El único efecto es la evaluación de la expresión de postfijo antes del punto o flecha.

Donde postfix-expression es la expresión del objeto para el que tiene lugar la llamada. Por lo tanto, una llamada a pseudo destructor, como una llamada a un destructor trivial, no termina la vida del objeto al que se aplica. Por ejemplo,

 int i = 0; (i += 5).~decltype(i)(); std::cout << i; 

En realidad, no se puede llamar a un destructor para los escalares, porque no tienen uno (ver [class.dtor]). La statement solo está permitida para el código de plantilla en el que llama al destructor de un objeto cuyo tipo no conoce, ya que elimina la necesidad de escribir una especialización para tipos escalares.


Se observó en los comentarios que [expr.pseudo] implica la existencia de un destructor para escalares por

El uso de un pseudo-nombre-destructor después de un punto . o flecha -> operador representa el destructor para el tipo no clase nombrado por nombre-tipo .

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

Un destructor se usa para destruir objetos de su clase.

Parece ser una imprecisión creada en C ++ 98 días.