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 : 41
    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 : 41
    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