OVH Cloud OVH Cloud

const char* reconnu comme bool ?

2 réponses
Avatar
v.p.
Bonjour,
Voici ce qui me titille aujourd hui.
Dans une classe j'ai deux methodes de meme nom :
void fonction(string A, string B)
et
void fonction(string A, bool B)

quand j'appelle

monobjet.fonction("foo", "blah");

il appelle la deuxieme !
alors qu'avec

monobjet.fonction("foo", string("blah"));

il appelle la premiere.

Qu'il faille specifier string("blah") pour obtenir un objet string
d'accord, puisque "unechaine" est en fait un const char* si je ne
m'abuse.
Mais alors pourquoi appelle t-il la premiere fonction sans broncher ?
Un const char* peut etre assimile a un bool ?
Ca me parait etrange tout de meme. Et a vous ?
Merci de combler mon ignorance.
Vincent

2 réponses

Avatar
Falk Tannhäuser
"v.p." wrote:
Dans une classe j'ai deux methodes de meme nom :
void fonction(string A, string B)
et
void fonction(string A, bool B)

quand j'appelle

monobjet.fonction("foo", "blah");

il appelle la deuxieme !
alors qu'avec

monobjet.fonction("foo", string("blah"));

il appelle la premiere.

Qu'il faille specifier string("blah") pour obtenir un objet string
d'accord, puisque "unechaine" est en fait un const char* si je ne
m'abuse.
Mais alors pourquoi appelle t-il la premiere fonction sans broncher ?
Un const char* peut etre assimile a un bool ?


Oui, les pointeurs peuvent être implicitement convertis vers 'bool',
un pointeur null étant converti en 'false' et un autre pointeur
valide en 'true' - tout cela pour maintenir la compatibilité avec
le C, voir le C++ pré-standard, où on écrivait souvent
"if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".

Lors de la résolution de la surcharge, cette conversion "standard"
est considérée comme meilleure que la conversion "définie par
l'utilisateur" à l'aide du constructeur std::string(char const*)
(cf. § 13.3.3.2/2 du Standard)

La solution serait d'ajouter quelque chose comme
void fonction(string A, char const* B) { fonction(A, std::string(B)); }
das ta classe.

Falk

Avatar
v.p.
Rebonjour,

? Un const char* peut etre assimile a un bool ?


Oui, les pointeurs peuvent être implicitement convertis vers 'bool',
un pointeur null étant converti en 'false' et un autre pointeur
valide en 'true' - tout cela pour maintenir la compatibilité avec
le C, voir le C++ pré-standard, où on écrivait souvent
"if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".

Lors de la résolution de la surcharge, cette conversion "standard"
est considérée comme meilleure que la conversion "définie par
l'utilisateur" à l'aide du constructeur std::string(char const*)
(cf. § 13.3.3.2/2 du Standard)


Ok. Merci beaucoup !

La solution serait d'ajouter quelque chose comme
void fonction(string A, char const* B) { fonction(A,
std::string(B)); }
das ta classe.


C'est ce que j'ai fait :-)
Encore merci pour cette reponse precise et rapide !
Vincent