Boost :: вариант посетитель выбирает неправильную перегрузку

Почему распечатывается следующее "A boolean!"? Я понимаю, что происходит какое-то странное преобразование, поскольку, если я явно создаю std :: string, я получаю правильное поведение. Но почему выбирают разрешение перегрузки? visitor::operator()(bool) в следующем случае?

#include <boost/variant.hpp>
#include <string>

typedef boost::variant<bool, std::string> type;

struct visitor : public boost::static_visitor<> {
void operator()(bool b) const {
std::cout << "A boolean!" << std::endl;
}

void operator()(const std::string& str) const {
std::cout << "A string!" << std::endl;
}
};

int main(int argc, char* argv[]) {
type t = "I am a string";
t.apply_visitor(visitor());

return 0;
}

Я использую Visual Studio 2012 (CTP или нет дает тот же результат)

7

Решение

Вы инициализируете t с (тип, который распадается на) const char*, Преобразование указателя в bool это стандартное преобразование при конвертации const char* в std::string это пользовательское преобразование. Стандартное преобразование имеет приоритет.

7

Другие решения

Других решений пока нет …