2013-03-26 3 views
7

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

#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 или не дает тот же результат)

+0

FTR член 'apply_visitor' не является частью открытого интерфейса. Вы должны использовать автономную версию: 'apply_visitor (visitor(), t)'. –

+0

Спасибо @LucDanton. Пропустил это, когда прочитал документацию –

ответ

7

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