46 votes

Pourquoi le compilateur préfère-t-il f(const void*) à f(const std::string &) ?

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++.

54voto

Yakk Points 31636

Convertir en un std::string nécessite une "conversion définie par l'utilisateur".

Convertir en void const* ne le fait pas.

Les conversions définies par l'utilisateur sont ordonnées derrière celles qui sont intégrées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X