Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Langage
Langage Langage C++, Programmation Orientée Objet, Templates, etc. Avant de poster : FAQ C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 16h08   #1
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 673
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 673
Points : 4 436
Points : 4 436
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?
r0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h30   #2
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 554
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 554
Points : 4 114
Points : 4 114
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(""));
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h32   #3
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 673
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 673
Points : 4 436
Points : 4 436
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).
r0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h38   #4
gbdivers
Expert Confirmé Sénior

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

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 318
Points : 19 564
Points : 19 564
J'aurais dit comme Bousk... et gcc confirme :
Citation:
bool
bool
string
bool
bool
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h39   #5
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 554
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 554
Points : 4 114
Points : 4 114
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
Type de fichier : png piege.png (47,9 Ko, 12 affichages)
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h45   #6
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 673
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 673
Points : 4 436
Points : 4 436
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
r0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h50   #7
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 753
Points : 753
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 ?
cob59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h56   #8
gbdivers
Expert Confirmé Sénior

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

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 318
Points : 19 564
Points : 19 564
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)
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h06.


 
 
 
 
Partenaires

Hébergement Web