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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top