String literal coincide con la sobrecarga de bool en lugar de std :: string

Estoy tratando de escribir una clase de C ++ que tenga algunos métodos sobrecargados:

class Output { public: static void Print(bool value) { std::cout << value ? "True" : "False"; } static void Print(std::string value) { std::cout << value; } }; 

Ahora digamos que llamo al método de la siguiente manera:

 Output::Print("Hello World"); 

este es el resultado

Cierto

Entonces, ¿por qué, cuando he definido que el método puede aceptar boolean y string, usa la sobrecarga booleana cuando paso en un valor no booleano?

EDITAR: vengo de un entorno C # / Java, ¡tan nuevo para C ++!

"Hello World" es un literal de cadena de tipo “array of 12 const char ” que se puede convertir en un “puntero a const char ” que a su vez se puede convertir en un bool . Eso es precisamente lo que está sucediendo. El comstackdor prefiere esto a usar el constructor de conversión de std::string .

Una secuencia de conversión que involucra un constructor de conversión se conoce como una secuencia de conversión definida por el usuario . La conversión de "Hello World" a bool es una secuencia de conversión estándar . La norma establece que una secuencia de conversión estándar siempre es mejor que una secuencia de conversión definida por el usuario (§13.3.3.2 / 2):

una secuencia de conversión estándar (13.3.3.1.1) es una mejor secuencia de conversión que una secuencia de conversión definida por el usuario o una secuencia de conversión de puntos suspensivos

Este análisis de “mejor secuencia de conversión” se realiza para cada argumento de cada función viable (y usted solo tiene un argumento) y la mejor función se elige mediante la resolución de sobrecarga.

Si quiere asegurarse de que se llama a la versión de std::string , debe darle una std::string :

 Output::Print(std::string("Hello World")); 

FWIW, se puede dirigir de esta manera (si se pueden usar plantillas), si no quieres agregar sobrecargas para const char* .

 #include  #include  #include  template {}>> void foo(Bool) { std::cerr << "bool\n"; } void foo(const std::string&) { std::cerr << "string\n"; } int main() { foo("bar"); foo(false); }