Причина заключается в том, что строковый литерале (char*
) преобразуется в bool
лучше, чем std::string
так ваша строке буквальной не инициализировать string
составляющей варианты, но вместо bool
компонента (истина).
См следующее выдающее bool 1
:
#include <iostream>
void foo(bool b)
{
std::cout << "bool " << b << std::endl;
}
void foo(std::string s)
{
std::cout << "string " << s << std::endl;
}
int main()
{
foo("Bar");
}
Initializing с std::string("toto")
решит вашу проблему.
4,12/1 показывает нам преобразование в вопрос:
A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a
prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false;
any other value is converted to true. A prvalue of type std::nullptr_t can be converted to a prvalue of
type bool; the resulting value is false.
[Как было отмечено также в другой ответ] Это неявное преобразование имеет приоритет над конвертерной конструктора std::string
и так выбран, в результате чего тип используемого в варианте будет bool
.