Pseudo-destruidor chamada não destruir um objeto
-
20-12-2019 - |
Pergunta
Considere o seguinte código:
#include <iostream>
typedef int t;
t a=42;
int main()
{
a.t::~t();
std::cout << a; //42
}
Eu esperava que a
vai ser destruído.Mas isso não é verdade, por quê?Como fazer isso de pseudo-destruidor chamada será destruído o objeto?
Solução
Mas isso não é verdade, por quê?
§5.2.4/1:
O único efeito é a avaliação do postfix-expressão antes do ponto ou uma seta.
Onde o postfix-a expressão é a do objeto para o qual a chamada ocorre.Assim, uma pseudo processo de destruição chamada como uma chamada para um trivial processo de destruição, não acaba o tempo de vida do objeto que ele é aplicado.Por exemplo,
int i = 0;
(i += 5).~decltype(i)();
std::cout << i;
Você não pode realmente chamar de um processo de destruição para escalares, porque eles não têm um (ver [classe.dtor]).A instrução é o único permitido para o modelo de código em que você chamar o destrutor de um objeto cujo tipo não sabe o que elimina a necessidade de escrever uma especialização de tipos escalares.
Observou-se nos comentários que [expr.pseudo] implica a existência de um processo de destruição por escalares por
O uso de um pseudo-destruidor-nome depois de um ponto
.
ou seta->
operador de representa o processo de destruição da não-tipo de classe chamado por tipo-nome.
No entanto, isso é inconsistente com outras partes do padrão, ex:§12, que chama um processo de destruição de uma função de membro especial e menciona que
Um processo de destruição é usado para destruir objetos do seu tipo de classe.
Parece ser uma imprecisão criado em C++98 dias.