Question

Si je comprends bien la norme, un destructeur trivial en est un qui est déclaré implicitement et dont la classe ne comporte que des membres de base et non statiques avec des destructeurs triviaux. Compte tenu de la récursivité de cette définition, il me semble que le seul "arrêt de la récursivité" condition est de trouver un membre de base ou non statique avec un destructeur non implicitement déclaré (c'est-à-dire déclaré par l'utilisateur). Si cela est vrai, cela devrait signifier qu'un destructeur trivial est un "qui n'a rien à faire". et par conséquent, il sera déclaré (implicitement) mais non défini. Dire autrement: est-il correct de dire qu'un destructeur implicitement défini (c'est-à-dire "cela fait quelque chose") ne peut pas être trivial selon la définition standard?

Désolé pour le genre de question idiote, mais je voudrais clarifier un peu les choses dans ma tête ...

Était-ce utile?

La solution

Non. Un destructeur trivial, défini implicitement, est par définition trivial :) La différence entre les objets déclarer et définir est que, pour que le compilateur puisse même voir qu'un destructeur est disponible, il doit toujours disposer d'une déclaration. Donc, si vous n'en fournissez pas, cela en implicitement.

Mais maintenant, il en définira également un, si cela est nécessaire (si un objet de ce type de classe est détruit). Dans tous les cas, il doit faire quelque chose: il doit appeler les destructeurs de tous ses membres et de ses classes de base. Un exemple simple illustrant l’effet de la définition implicite d’un destructeur:

struct a {
private:
    ~a();
};

struct bug {
    // note: can't be destructed
    a a_;
};

Dès que vous essayez de créer un objet de bogue local, le compilateur signalera une erreur, car il génère la définition d'un destructeur pour bogue, qui tente d'appeler le destructeur non accessible d'un.

Maintenant, je pense que la trivialité des destructeurs / constructeurs est principalement utilisée pour imposer des contraintes à votre programme. Les objets dont les versions ne sont pas triviales ne peuvent pas être mis en union, par exemple. De l’autre côté, vous pouvez supprimer un objet de type incomplet, à condition qu’il possède un destructeur trivial. Notez que si votre programme ne peut pas décider si un destructeur trivial a été défini ou non, le compilateur est autorisé à l'omettre. C'est la règle dite as-if . Le compilateur doit se comporter comme si il était conforme à la norme - les optimisations importent peu tant qu'elles ne changent pas la signification d'un programme.

Autres conseils

Votre libellé est un peu regrettable. Par exemple. Bien entendu, la récursivité se termine également lorsque vous manquez de membres et de classes de base. Ces problèmes de formulation semblent également vous rendre plus confus.

Quoi qu’il en soit, tous les destructeurs déclarés implicitement, qu’ils soient triviaux ou non, sont définis si et seulement si ils sont utilisés. Utilisé est un terme spécifique ici. Un destructeur de type T est utilisé à la fin de la durée de vie d’un objet T.

Des destructeurs triviaux existent car les programmeurs C placent des structures dans des unions. Ce code devrait rester légal en C ++, de sorte que la notion de destructeur trivial a été inventée pour C ++. Toutes les structures C ont des destructeurs triviaux lorsqu’elles sont compilées en C ++.

Considérez ces deux classes:

class A {
};

class B {
private:
     A obj;
};

Les destructeurs de ces deux classes définis implicitement. Pourtant, en même temps, les deux sont triviaux selon la définition standard.

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