68 votes

Les destructeurs de builtin types (int, char, etc..)

En C++, le code suivant donne une erreur de compilation:

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

Ce code est presque le même, je viens de typedef int à un autre type et quelque chose de magique se produit:

typedef int myint;

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

Pourquoi le deuxième code fonctionne? Un int obtient un destructeur juste parce qu'il a été typedefed?

Dans le cas où vous vous demandez pourquoi on jamais aimerait le faire: Cela vient de refactoring de code C++. Nous sommes à la suppression de la norme de tas et de le remplacer avec selfmade piscines. Cela exige de nous d'appel de placement-les nouvelles et les destructeurs. Je sais que le fait d'appeler les destructeurs pour les types primitifs est inutile, mais nous voulons dans le code néanmoins dans le cas plus tard, nous avons remplacer les Gousses avec de vraies classes.

De découvrir que le nu int de ne pas travailler, mais typedefed n'était tout à fait une surprise.

Btw - j'ai une solution qui implique un modèle de fonctions. Nous venons de définition de type à l'intérieur du modèle et tout va bien.

108voto

Johannes Schaub - litb Points 256113

C'est la raison qui fait que votre code fonctionne pour les paramètres génériques. Envisager un conteneur C:

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

Il serait ennuyeux de présenter des cas particuliers pour des types intégrés. C++ permet de faire ci-dessus, même si T arrive égale à int. Le saint-Standard dit en 12.4 p15:

La notation pour l'appel explicite du destructeur peut être utilisé pour tout type scalaire nom. Permettant ce qui permet d'écrire du code sans avoir à savoir si un destructeur existe pour un type donné.

La différence entre l'utilisation d'une plaine int et un typedef ed int, c'est qu'ils sont syntaxiquement différentes choses. La règle est que, dans un destructeur d'appel, la chose après l' ~ est un type de nom. int n'est pas une telle chose, mais une définition de type nom-de-l'est. Regarder en 7.1.5.2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X