Question

Considérez le code suivant :

#include <iostream>

typedef int t;
t a=42;

int main()
{
    a.t::~t();
    std::cout << a; //42
}

je m'attends à ce que a va être détruit.Mais ce n'est pas vrai, pourquoi ?Comment cet appel de pseudo-destructeur va-t-il détruire l'objet ?

Était-ce utile?

La solution

Mais ce n'est pas vrai, pourquoi ?

§5.2.4/1:

Le seul effet est l'évaluation de l'expression postfixée avant le point ou la flèche.

Où l'expression postfixée est l'expression de l'objet pour lequel l'appel a lieu.Ainsi, un appel de pseudo-destructeur, comme un appel à un destructeur trivial, ne met pas fin à la durée de vie de l'objet auquel il est appliqué.Par exemple,

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

Vous ne pouvez pas réellement appeler un destructeur pour les scalaires, car ils n'en ont pas (voir [class.dtor]).L'instruction est uniquement autorisée pour le code de modèle dans lequel vous appelez le destructeur d'un objet dont vous ne connaissez pas le type - elle supprime la nécessité d'écrire une spécialisation pour les types scalaires.


Il a été noté dans les commentaires que [expr.pseudo] implique l'existence d'un destructeur pour les scalaires par

L'utilisation d'un nom-pseudo-destructeur après un point . ou une flèche -> L'opérateur représente le destructeur du type non de classe nommé par nom-type.

Cependant, cela n'est pas cohérent avec d'autres parties de la norme, par ex.§12, qui appelle un destructeur une fonction membre spéciale et mentionne que

Un destructeur est utilisé pour détruire des objets de son type de classe.

Cela semble être une imprécision créée en 98 jours en C++.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top