Почему распечатывается следующее "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 или нет дает тот же результат)
Вы инициализируете t
с (тип, который распадается на) const char*
, Преобразование указателя в bool
это стандартное преобразование при конвертации const char*
в std::string
это пользовательское преобразование. Стандартное преобразование имеет приоритет.
Других решений пока нет …