Question Un destructeur peut-il appeler une fonction non-const sur un objet const?


J'ai cherché la réponse à cette question et je n'ai pas pu en trouver une. Considérez le code suivant:

struct Foo
{
    int *bar;
    Foo(int barValue) : bar(new int(barValue)) {}
    ~Foo() { do_this(); }
    void do_this() { delete bar; bar = nullptr; }
};

int main()
{
    const Foo foo(7);
}

do_this() ne peut pas être appelé sur un const objet, donc je ne pouvais pas faire quelque chose comme foo.do_this(). Il serait également judicieux dans certaines situations d'appeler do_this() en dehors du destructeur, c'est pourquoi je ne veux pas simplement inclure le code dans la définition du destructeur. Car do_this() modifie une variable membre, je ne peux pas le déclarer comme const.

Ma question est la suivante: le destructeur pourra-t-il appeler do_this() sur un const objet lorsque l'objet est détruit?

Je l'ai essayé et je n'ai reçu aucune erreur, mais je veux m'assurer que je ne provoque pas de fuite de mémoire une fois que mon programme se termine.


13
2018-03-06 16:38


origine


Réponses:


Oui, vous pouvez certainement appeler en toute sécurité des fonctions non-const du destructeur. Standard autorise explicitement ceci:

15.4 / 2 Un destructeur est utilisé pour détruire des objets de son type de classe. L'adresse   d'un destructeur ne doit pas être prise. Un destructeur peut être appelé pour un   const, objet volatile ou const volatil. sémantique const et volatile   ([dcl.type.cv]) ne sont pas appliqués sur un objet en cours de destruction. Ils   cesser d'être en vigueur lorsque le destructeur de l'objet le plus dérivé   départs.


12
2018-03-06 16:57