Question

En C ++, le code suivant génère une erreur de compilation:

void destruct1 (int * item)
{
  item->~int();
}

Ce code est presque identique, je viens de taper le type entier dans un autre type et quelque chose de magique se produit:

typedef int myint;

void destruct2 (myint * item)
{
  item->~myint();
}

Pourquoi le second code fonctionne-t-il? Est-ce qu'un int a un destructeur juste parce qu'il a été typé?

Au cas où vous vous demanderiez pourquoi on aimerait faire cela: Cela vient du refactoring du code C ++. Nous supprimons le tas standard et le remplaçons par des pools créés par nos soins. Cela nécessite que nous appelions placement-new et les destructeurs. Je sais que l'appel des destructeurs pour les types primitifs est inutile, mais nous les voulons néanmoins dans le code, au cas où nous remplacerions les POD par des classes réelles.

Le fait de savoir que les int nus ne fonctionnent pas mais que les typés sont vraiment une surprise.

Btw - J'ai une solution qui implique des fonctions de modèle. Nous venons de taper dans le modèle et tout va bien.

Était-ce utile?

La solution

C'est la raison pour laquelle votre code fonctionne pour les paramètres génériques. Considérons un conteneur C:

template<typename T>
struct C {
    // ...
    ~C() {
        for(size_t i = 0; i<elements; i++)
            buffer[i].~T();
    }
};

Il serait ennuyeux d’introduire des cas spéciaux pour les types intégrés. Donc C ++ vous permet de faire ce qui précède, même si T est égal à int . La norme sacrée dit dans 12.4 p15 :

  

La notation pour l'appel explicite d'un destructeur peut être utilisée pour tout nom de type scalaire. Cela permet d'écrire du code sans avoir à savoir s'il existe un destructeur pour un type donné.

La différence entre un int simple et un int typedef est que ce sont des choses syntaxiquement différentes. La règle est que, dans un appel de destructeur, ce qui suit le ~ est un nom de type. int n'est pas une telle chose, mais un nom de type est. Recherchez-le dans 7.1.5.2 .

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