Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 070
    Points : 5 085
    Points
    5 085

    Par défaut surcharge de fonction, bool et string

    Bonjour,

    je vous propose une petite question piège. Prenons le code suivant:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void f( const std::string & str ) { std::cout << "string" << std::endl; }
    void f( bool b ) { std::cout << "bool" << std::endl; }
     
    main()
    {
       std::string str = "test";
       bool b = false;
     
       f( "test" );
       f( true );
       f( str );
       f( b );
       f( "" );
    }
    Question: quel est l'output de ce programme?

    Approfondissement de la question: pourquoi?

  2. #2
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 048
    Points : 4 819
    Points
    4 819

    Par défaut

    Selon moi:
    bool
    bool
    string
    bool
    bool

    Tout simplement parce que "" est une chaîne vide, doit un const char* qui sera transtypé en bool avant std::string
    Pour forcer le transtypage en string, il faut l'expliciter avec f(std::string(""));

  3. #3
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 070
    Points : 5 085
    Points
    5 085

    Par défaut

    héhé, tu as évité un piège, mais tu es tombé dans le second ;p
    essaie de compiler...

    d'ailleurs, si quelqu'un a une version récente de gcc et pouvais tester, ça pourrait être intéressant (je n'ai pas de gcc sous la main).

  4. #4
    Inactif


    Homme Profil pro Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 318
    Points
    17 318

    Par défaut

    J'aurais dit comme Bousk... et gcc confirme :
    bool
    bool
    string
    bool
    bool

  5. #5
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 048
    Points : 4 819
    Points
    4 819

    Par défaut

    J'ai compilé (moyennant l'ajout des includes etc) sur visual 2010, et j'obtiens exactement ça

    Quel résultat as-tu ? Lequel attends-tu ?
    Images attachées Images attachées

  6. #6
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 070
    Points : 5 085
    Points
    5 085

    Par défaut

    ooops oui, vous avez raison, my bad
    oui oui, j'obtiens bien la même chose avec ms vc.
    J'ai confondu sur le premier appel: f( "test" ); j'ai cru que tu disais que ça appelais la version f(const std::string &);

    Vous avez donc bien répondu tous les deux, sorry

  7. #7
    Membre émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 801
    Points
    801

    Par défaut

    Il est quand même étrange que les appels 1 et 5 n'émettent pas une erreur "appel ambigu" à la compilation... puisque c'est manifestement le cas, non ?

  8. #8
    Inactif


    Homme Profil pro Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 318
    Points
    17 318

    Par défaut

    Une petite source, pour les explications : http://en.cppreference.com/w/cpp/language/implicit_cast

    Ce qui se passe, c'est que le compilateur à le choix entre une conversion du pointeur en bool (voir la partie "Boolean conversions") ou appeler un constructeur de conversion. La règle de résolution des noms (indiqué en haut de page) indique qu'une conversion implicite standard est préférée à la conversion par appel d'une fonction définie par l'utilisateur

    EDIT : @cob59, sur MSVC, c'est l'erreur C4800 (mais je sais pas comment on l'active ou si elle est activée par défaut)

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •