为什么以下打印"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或不提供相同的结果)
答案 0 :(得分:7)
您的初始版t
带有(衰减的类型)const char*
。将指针转换为bool
是标准转换,而将const char*
转换为std::string
是用户定义的转换。标准转换优先。