У меня две перегруженные функции
void foo(std::string value);
void foo(bool value);
когда я звоню с
foo(true ? "a" : "b");
почему функция принимает логическое значение будет вызываться вместо строки?
bool
перегрузка обеспечивает лучшее соответствие, так как вы получаете преобразование между const char*
а также bool
, Перегрузка строки требует преобразования в пользовательский тип.
Условный оператор не имеет к этому никакого отношения. Например,
#include <string>
#include <iostream>
void foo(bool) { std::cout << "bool" << std::endl; }
void foo(std::string) { std::cout << "string" << std::endl; }
int main()
{
foo("a");
}
Выход:
BOOL
Если бы вы должны были обеспечить перегрузку
void foo(const char*) {}
тогда этот будет назван.
Других решений пока нет …