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

时间:2013-03-26 11:39:46

标签: 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;
}

我正在运行Visual Studio 2012(CTP或不提供相同的结果)

1 个答案:

答案 0 :(得分:7)

您的初始版t带有(衰减的类型)const char*。将指针转换为bool是标准转换,而将const char*转换为std::string是用户定义的转换。标准转换优先。