Considérons le morceau de code suivant :
#include <iostream>
#include <string>
// void f(const char *) { std::cout << "const char *"; } // <-- comment on purpose
void f(const std::string &) { std::cout << "const std::string &"; }
void f(const void *) { std::cout << "const void *"; }
int main()
{
f("hello");
std::cout << std::endl;
}
J'ai compilé ce programme en utilisant g++ (Ubuntu 6.5.0-1ubuntu1~16.04) 6.5.0 20181026
:
$ g++ -std=c++11 strings_1.cpp -Wall
$ ./a.out
const void *
Notez que le commentaire est là exprès pour tester, autrement le compilateur utilise f(const char *)
.
Alors, pourquoi le compilateur choisit-il f(const void*)
sur f(const std::string &)
?
5 votes
Voici la partie pertinente de la norme : eel.is/c++draft/over.ics.rank#2.1
0 votes
@geza génial. Je le cherchais, merci.
0 votes
La règle de résolution des surcharges est ici simple et inchangée dans les nombreuses versions du C++.
0 votes
#include <iostream> #include <typeinfo> int main() { std::cout << typeid("foo").name() << " - " << typeid(string("foo")).name(); return 0; }
4 votes
Eh bien, une chaîne littérale est pas un
std::string
il s'agit d'un tableau statique dechar
qui se transforme en un pointeur vers son premier caractère. Ce comportement est hérité de C qui n'a jamais eu quelque chose commestd::string
mais une grande quantité de code manipulant des chaînes de caractères.1 votes
Si vous souhaitez spécifiquement un
std::string
littéral, vous pouvez y parvenir en ajoutant uns
derrière le littéral. Il s'agit d'un littéral défini par l'utilisateur qui est disponible depuis C++14. fr.cppreference.com/w/cpp/string/basic_string/operator%22%22s0 votes
@geza Envisagez de poster comme une réponse...