boost :: variant访问者选择了错误的重载

Mat*_*sen 7 c++ boost boost-variant apply-visitor

为什么以下打印出来"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;
}
Run Code Online (Sandbox Code Playgroud)

我正在运行Visual Studio 2012(CTP或者没有给出相同的结果)

Rei*_*ica 7

你初始化t了一个(衰变的类型)const char*.将指针bool转换为标准转换,而转换const char*std::string用户定义的转换.标准转换优先.