IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Desctructeur virtuel et default c++0x


Sujet :

Langage C++

  1. #21
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Je sais pas si c'est l'auteur d'effective C++ ou si c'est un homonyme, mais je vais remplir un rapport de bug... Sait-on jamais.
    Ouaip c'est lui. Par curiosité, t'as posté sur clc++.m ou clc++ ? J'ai pas vu passez ton message ...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  2. #22
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Goten Voir le message
    Ouaip c'est lui. Par curiosité, t'as posté sur clc++.m ou clc++ ? J'ai pas vu passez ton message ...
    Il est pourtant déjà référencé par google:http://groups.google.com/group/comp....4d4b6c1704f1f#
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #23
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    C'est bien ce que je disais il a pas posté là :p. Je regarde réguliémement que comp.lang.c++.moderated pas std
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #24
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Oui >< ! Pourquoi, j'ai fais quelque chose de mal ?
    Apparement oui parce que ton bug est INVALID maintenant

  5. #25
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bah, faut dire qu'entre un titre pas clair ("Unvirtualization of virtual destructor" ?? Qu'est ce que ça veut dire ce truc ?), aucune mention de la différence de comportement avec une déclaration interne puis externe avec =default, pas de lien vers le thread sur comp.std.c++ et un exemple qui ne compile pas... c'était pas vraiment extraordinaire comme bug report

    Edit : Ha, y a l'air d'avoir un moyen de réouvrir le bug. Je vais faire une nouvelle tentative pour passer le cerbère (parce que bon, il est quand même pas commode ce Paolo Carlini )

  6. #26
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    C'est Arch qui as posté sur comp.std.c++... et marqué un bug comme invalid pour une *, je trouve que c'est un peu de la mauvaise volonté quand même >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  7. #27
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Bah, faut dire qu'entre un titre pas clair ("Unvirtualization of virtual destructor" ?? Qu'est ce que ça veut dire ce truc ?), aucune mention de la différence de comportement avec une déclaration interne puis externe avec =default, pas de lien vers le thread sur comp.std.c++ et un exemple qui ne compile pas... c'était pas vraiment extraordinaire comme bug report

    Edit : Ha, y a l'air d'avoir un moyen de réouvrir le bug. Je vais faire une nouvelle tentative pour passer le cerbère (parce que bon, il est quand même pas commode ce Paolo Carlini )
    Je peux changer le titre je crois... Tu penses à quoi ?
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  8. #28
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Je peux changer le titre je crois... Tu penses à quoi ?
    on pourrait tenter "[C++0x] defaulted virtual destructor isn't virtual" ou [C++0x]Default constructed destructor does'nt make virtual destructor
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #29
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Titre : [C++0x] =default erases virtual declaration of a destructor.
    Explication :
    Following code
    #include <iostream>

    struct A {
    virtual ~A()=default;

    };

    struct B : public A {
    virtual ~B() {
    std::cout << "B destructor\n";
    }

    };

    int main() {
    B* b = new B;
    A* pA = b;
    delete pA;
    return 0;
    }
    outputs nothing, B destructor is not called as if A destructor was not considered as virtual.

    However, following code works fine :
    #include <iostream>

    struct A {
    virtual ~A();
    };

    A::~A()=default;

    struct B : public A {
    virtual ~B() {
    std::cout << "B destructor\n";
    }

    };

    int main() {
    B* b = new B;
    A* pA = b;
    delete pA;
    return 0;
    }
    It outputs "B destrucor".
    Je l'aurais bien saisi, mais je n'ai pas de compte gcc et j'ai la flemme d'en créer un maintenant. A tout hasard j'ai envoyé un mail à paolo.carlini en lui proposant les modifications ci-dessus et en lui disant qu'on en a discuté ici et sur comp.std.c++.

  10. #30
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Beaucoup de nouveau sur le file du bug, notemment le core issue 906 qui clarifie la situation.

    Rappelle du lien ers le bug.

    Pour ceux qui ont la flemme, mon code initial est illegal, la première solution d'Archi est la bonne.

    [edit] Malheureusement, la question de savoir si la defaut-declared syntaxe à plus d'intérêt à être accepté virtual est un autre débat... Qui aura (peut-être ?) lieu sur comp.std.c++. Donc je met le sujet en résolue, à moins qu'on le tienne ouvert pour faire un compte rendu fr de ce qui se dit.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  11. #31
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Pour ceux qui ont la flemme, mon code initial est illegal, la première solution d'Archi est la bonne.
    Effectivement, il semblerait qu'il y ait eu du changement depuis et que l'on ne puisse plus faire virtual ~type()=default. Il faut séparer déclaration virtuelle de définition par défaut. Dans la même veine, on ne devrait pas pouvoir faire une définition par défaut si l'accès n'est pas publique ou pour un constructeur, s'il est explicit. Comme le dit Arzar, ces limitations diminuent l'intérêt des définitions par défaut...
    J'ai continué la discussion dans le fil sur com.std.c++ car ça me parait un peu limitatif comme approche...

  12. #32
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    [HS]
    Je me demandais aussi, comment se fait-il que le n3000, publier en novembre 2009, ne mentionne pas le core-issue, qui date quand même du 27 mai 2009 oO ?
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  13. #33
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Réécriture hative post retrait des concepts sans doute?


    Heu sinon ça me déçoit grandement ce genre de changement qui rends la feature bancale (au moins syntaxiquement, ça fait de la répétition inutile).
    Est-ce qu'il y a quelque part une trace de discussion qui leur a amené au point où ils proposent de permettre default uniquement sur une définition extérieure? (si j'ai bien compris)

  14. #34
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Je viens de passer sur comp.std.c++, apparemment, le core-issue n'est pas la norme tant que celui-ci ne se trouve pas dans un draft.

    En faite, l'équipe gcc a décidé de faire comme disait le core-issue, mais la norme elle n'as rien décidé.

    Je rejoint S. Meyers pour dire qu'il y a un problème de "trivialité". En gros, l'esprit du core issue, c'est de dire qu'une fonction "defaulted on first-declaration" est trivial. Donc que lorsqu'on voit une définie avec des =default partout, il s'agit d'une classe potentiellement trivial.

    Je trouve cette façon de voir la chose assez stupide. Comme beaucoup ici, je voyais =default un peu comme le moyen de ne plus mettre d'accolade vide... Pas d'écrire quelque chose qu'on n'aurait pas eut besoin d'écrire.
    A part pour la beauté du geste, je me voit mal écrire 4 lignes qui ne changeront rien >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  15. #35
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    A vrai dire, avec les restrictions apportées par le core issue, je me demande quel serait l'avantage du =default...

    Pour ne prendre que le destructeur (mais on pourrait faire la même remarque pour les autres fonctions qui sont susceptibles d'être déclarée par défaut):
    • Si le destructeur doit détruire des objets pour lesquels on a eu recours à l'allocation dynamique, on se heurte au même problèmes que pour le comportement actuellement observé: comment le compilateur va-t-il déterminer qu'il doit bel et bien invoquer delete / delete[]
    • S'il n'y a pas de membres pointeurs, mais qu'on ne peut pas déclarer le destructeur virtuel (du moins, si cela n'évite pas d'avoir à définir le destructeur), où est l'avantage
    • Si le destructeur doit être public, encore une fois, nous ne pourrons pas définir un destructeur non virtuel mais protégé
    Autrement dit, nous sommes, exactement, dans la même situation que maintenant, à part le fait que nous explicitons le fait qu'il a un comportement considéré comme par défaut dans le respect de la forme canonique de coplien qui s'applique.

    Alors, si on applique effectivement le core issue, est-il prérérable d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClass::~MaClass() = default;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaClass::~MaClass()
    {
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaClass::~MaClass() = default
    {
    }
    La troisième solution est, à mon sens, la plus mauvaise, mais, entre les deux autres, j'avoue ne pas savoir si je préfère l'une ou l'autre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #36
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par koala
    Si le destructeur doit être public, encore une fois, nous serons obligés de définir un destructeur non virtuel mais protégé
    En réalité, le problème ne se pose que pour les first-line default-declared ou appelle ça comme tu veux. Sinon, tu peux très bien déclarer ou tu veux du moment ou tu ne met pas =default à la déclaration. Virtuel public ou protégé, même châtiment.

    Ta dernière proposition est invalide. Les deux premières sont valides, et "l'esprit" du core est la première écriture.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  17. #37
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Lavock Voir le message
    En réalité, le problème ne se pose que pour les first-line default-declared ou appelle ça comme tu veux. Sinon, tu peux très bien déclarer ou tu veux du moment ou tu ne met pas =default à la déclaration. Virtuel public ou protégé, même châtiment.
    Déjà là, cela m'ennuie dans le sens où le fait que le destructeur ait un comportement par défaut (appel des destructeurs des membres de la classe) et le fait qu'il soit virtuel (et donc susceptible, grâce à la vtable, d'appeler le destructeur de la classe fille) sont deux points de vues tout à fait orthogonaux:

    L'un n'empêche absolument pas l'autre, et le compilateur est tout à fait en mesure de faire la différence.

    Il *devrait* donc être en mesure d'implémenter correctement un destructeur déclaré virtuel et par défaut

    Ta dernière proposition est invalide.
    Je m'en doutais
    Les deux premières sont valides, et "l'esprit" du core est la première écriture.
    J'ai peut-être mal lu, pour le destructeur privé...

    j'avais cru comprendre (mais il faut laisser croire les béguines, hein) que le seul cas où il serait possible de ne pas devoir fournir l'implémentation du destructeur était le destructeur public non virtuel

    J'ai du confondre avec le constructeur explicite (re ), mais, là encore, comme il s'agit de deux concepts orthogonaux, je ne vois pas vraiment ce qui pourrait les empêcher de cohabiter

    Quelque par, l'ajout d'un "=default" aux fonctions qui interviennent dans les formes canoniques ne représente, à l'extrême limite qu'un flag non exclusif à prendre en compte lors de l'analyse du code
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #38
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    J'avoue que avec les couleurs, les crochets et tout, c'est pas super lisible...
    En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class illformed {
      ~illformed() = default; // Pas bien car private
    };
     
    class correct {
      ~correct();
    };
     
    correct::~correct() = default; //pas de soucis
    En faite, le core 906 posent une sévère différence entre mettre =default dans la définition de la classe ou ailleurs.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  19. #39
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    A vrai dire, je ne vois pas pourquoi ta class illformed serait mal formée...

    Encore une fois, ce n'est pas parce que le destructeur est privé et qu'il impose donc certaines restrictions quant à son utilisation que son comportement ne peut pas être totalement trivial dans le sens où il se "contente" de détruire les différents membres dans l'ordre inverse de leur construction.

    Encore une fois, l'attribut de visibilité n'est qu'un flag nécessaire pour déterminer dans quelle mesure on peut utiliser la fonction, alors que le comportement par défaut en est un qui permet au compilateur de déterminer qu'il doit fournir le code binaire "classique" (et clairement défini) pour la dite fonction.

    C'est un peu comme si tu disais qu'il est interdit d'avoir une fonction qui soit à la fois virtuelle et privée: cela a si peu de sens (parce que ce sont deux concepts totalement orthogonaux) que la technique est régulièrement utilisée avec l'idiome NVI
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  20. #40
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Fiiiou, il y a eu pas mal de développement en quelques jours.

    Je retiens surtout l'intervention de Daniel Krügler (qui fait partie du comité) sur comp.std.c++
    Citation Envoyé par Daniel Krügler
    Your description is quite clear. Notice that the constraints for
    defaulting a special member function is still in flux, see

    http://www.open-std.org/jtc1/sc22/wg...ctive.html#667
    http://www.open-std.org/jtc1/sc22/wg...ctive.html#906

    therefore it's hard to foresee the final decision.
    Les détails du comportement de la syntaxe en =default ne semblent donc pas encore définitivement fixés. Wait & See

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 25
    Dernier message: 04/12/2004, 12h06
  2. mémoire virtuelle minimale insuffisante
    Par sempire dans le forum Windows XP
    Réponses: 16
    Dernier message: 15/10/2003, 17h29
  3. [Turbo Pascal] Limite de la mémoire virtuelle
    Par moon tiger dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 08/02/2003, 22h30
  4. Existe-t-il un langage de prog "virtuel" en Français
    Par HRS dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 10/06/2002, 18h11
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo