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

C++ Discussion :

[Syntaxe] temporaire non nommé et constructeur copie privée


Sujet :

C++

  1. #1
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut [Syntaxe] temporaire non nommé et constructeur copie privée
    Bonjour,
    gcc 3.4.5 me refuse ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class A {  A( const A& );
    public:
      A() {}
    };
    void foo ( const A& a ) {}
    int main() {   foo( A() ); }
    temp_unamed.cpp: In function `int main()':
    temp_unamed.cpp:2: error: `A::A(const A&)' is private
    temp_unamed.cpp:12: error: within this context

    VS2003 et VS2005 ne disent rien et j'ai pas de gcc 4 sous la main.

    qui à tort ou raison ?
    Merci

  2. #2
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    C'est privé par défaut si l'on ne le spécifie pas?
    Pourquoi ne pas écrire ton const/copie ds la partie public (ou privée)?
    Si c'est une rvalue que tu cherches à créer, je ne sais pas si ca s'adapte pour les fonctions ou méthodes...

    Je ne vois pas trop l'intéret comme ca, ca t'appelle le constructeur par def de A puis foo...

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Oui, les fonctions membres sont privées par défaut dans une classe.
    Par contre, elles sont publiques par défaut dans une structure. (je crois bien d'ailleurs que c'est la seule différence avec une classe)

  4. #4
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Ok merci :p

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    qui à tort ou raison ?
    GCC.
    Le standard dit que quand on passe un temporaire par référence celui-ci doit être copiable.

    Comeau est plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ComeauTest.c(7): error: "A(const A &)" (declared at line 2), required for copy that
      was eliminated, is inaccessible
      int main() {   foo( A() ); }
                          ^
     
    1 error detected in the compilation of "ComeauTest.c".

  6. #6
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    kézako commeau?

  7. #7
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par loufoque
    GCC.
    Le standard dit que quand on passe un temporaire par référence celui-ci doit être copiable.

    Comeau est plus clair :
    ah oui, j'ai pas pensé à comeau pour tester.
    Merci.


    Bon dommage, pour moi en tout cas, je ferais sans.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par lun4t1k
    kézako commeau?
    Un compilateur C++ qui est connu pour respecter relativement bien le standard.
    Je crois même me souvenir que tu peux compiler des bouts de code en ligne.

  9. #9
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Apparement il n'est pas compatible avec visual studio 8
    dommage...

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par lun4t1k
    Apparement il n'est pas compatible avec visual studio 8
    dommage...
    Qu'est-ce qui n'est pas compatible ?

  11. #11
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    compilable on va dire

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par loufoque
    Le standard dit que quand on passe un temporaire par référence celui-ci doit être copiable.
    Je connaissais pas cette règle. Pour quelle raison une telle restriction, puisque y'a pas de copie à faire?
    (Ceci dit je suis jamais tombé sur ce problème puisque c'est pas courant de déclarer les constructeurs de copie comme étant privé)

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Charlemagne
    Je connaissais pas cette règle. Pour quelle raison une telle restriction, puisque y'a pas de copie à faire?
    Un appel explicite au constructeur est une rvalue. Tout comme les résultats de fonctions qui ne retournent pas des références ou les littéraux et d'un certain nombre d'opérateurs.

    Quand on passe une rvalue à une référence (qui doit être nécessairement constante), il faut introduire un temporaire qui est un nouvel objet non nommé (par exemple pour contenir le résultat de l'opération 1+3 que l'on passe à un int const&).

    Pour créer le nouvel objet, il faut appeler son constructeur de copie soit visible (oui, le constructeur de copie qui prend généralement un A const& est traité particulièrement).

    Une création de temporaire par l'appel du constructeur de copie est généralement supprimable -- mais le constructeur de copie doit rester visible?

    (Ceci dit je suis jamais tombé sur ce problème puisque c'est pas courant de déclarer les constructeurs de copie comme étant privé)
    C'est au contraire extrèmement courant. C'est rare d'avoir des classes copiables qui ont des fonctions virtuelles.

  14. #14
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet

    Une création de temporaire par l'appel du constructeur de copie est généralement supprimable -- mais le constructeur de copie doit rester visible?
    Je pense que visual supprime cet appel et autorise donc la non visibilité du constructeur. alors que gcc, alors qu'il supprime aussi cet appel, demande la visibilité.

    Il n'y a pas une histoire d'optimisation sans effet de bord (que pourrait avoir lieu lors de l'appel à ce constructeur) ?

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Pour créer le nouvel objet, il faut appeler son constructeur de copie soit visible (oui, le constructeur de copie qui prend généralement un A const& est traité particulièrement).
    Je comprends pas.
    Pour créer un nouvel objet, il faut appeler un constructeur tout court, pas son constructeur de copie.


    Citation Envoyé par Jean-Marc.Bourguet
    C'est au contraire extrèmement courant. C'est rare d'avoir des classes copiables qui ont des fonctions virtuelles.
    Je trouve pas que ce soit si courant que ça. En tout cas l'immense majorité des objets devrait être copiable. Dans la STL c'est le cas. (Toutefois par ex les streams ne sont pas copiables). Une classe non copiable n'est pas une classe "normale".
    Et puis le constructeur de copie est défini par défaut.

    Je vois pas le rapport avec les fonctions virtuelles, à part le fait que dans ce cas le constructeur de copie ne suffit généralement pas aux besoins, mais qu'il faut un "constructeur de copie virtuel" nommé généralement "clone" dans les bouquins.

  16. #16
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Note: le point d'interrogation est une typo, je ne me pose pas de question la dessus.

    Citation Envoyé par Hylvenir
    Je pense que visual supprime cet appel et autorise donc la non visibilité du constructeur.
    Ce qui est clairement un bug.
    alors que gcc, alors qu'il supprime aussi cet appel, demande la visibilité.
    Ce qui est clairement conforme.

    Il n'y a pas une histoire d'optimisation sans effet de bord (que pourrait avoir lieu lors de l'appel à ce constructeur) ?
    En regle generale, toute optimisation est autorisee si elle n'est pas detectable par un programme conforme. Dans le cas present, un programme conforme peut la detecter (en comptant le nombre d'appel au constructeur de copie) mais il y a des provisions speciales dans la norme pour l'autoriser.

  17. #17
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par Charlemagne
    Je trouve pas que ce soit si courant que ça. En tout cas l'immense majorité des objets devrait être copiable. Dans la STL c'est le cas. (Toutefois par ex les streams ne sont pas copiables). Une classe non copiable n'est pas une classe "normale".
    Tu remarqueras que les classes de la STL possèdent peu de fonctions virtuelles (à part dans les buffer interne pour les stream justement).

    Citation Envoyé par Jean-Marc Bourguet
    Ce qui est clairement un bug.
    Dommage, je le trouvais bien pour une fois leur compilo...

  18. #18
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par Hylvenir
    Tu remarqueras que les classes de la STL possèdent peu de fonctions virtuelles (à part dans les buffer interne pour les stream justement).
    Bien sûr, mais ça ne répond pas à ma question: pourquoi le constructeur de copie serait nécessaire (mis à part que le standard l'exige) pour un passage par référence constante?
    Ni à ma question subsidiaire sur le point soulevé par Jean-Marc: quel est le rapport entre le constructeur de copie et les fonctions virtuelles?

    PS: je crois pas que les streams sont non copiables à cause de leurs fonctions virtuelles, mais plutôt que c'est une sécurité pour empêcher l'utilisateur des accès multiples à une unique ressource.

  19. #19
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Bah un const par copie est nécessaire si l'on veut éviter une copie champ par champ qu'impose celui par défaut.

    J'ai peut etre pas tout compris le problème.

  20. #20
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par lun4t1k
    J'ai peut etre pas tout compris le problème.
    Je confirme

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/01/2011, 18h20
  2. Réponses: 3
    Dernier message: 23/07/2007, 18h01
  3. [Syntaxe] Image non affichée
    Par patrick_deb dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 30/12/2006, 11h16
  4. Probleme de cast en constructeur copy.
    Par hickscorp dans le forum C++
    Réponses: 13
    Dernier message: 23/08/2006, 14h06
  5. [Info] Open source, Divx et copie privée
    Par nuke_y dans le forum Politique
    Réponses: 122
    Dernier message: 22/12/2005, 10h58

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