我在使用 boost::variant
时遇到问题(使用 boost 1.67.0)。
当我的模板参数列表同时包含 bool
和 std::string
时,任何应视为字符串的变体对象似乎都隐式绑定(bind)到 bool。例如:
using Varval = boost::variant<bool, std::string>;
void main()
{
std::vector<Varval> vect{ true, false, "Hello_World" };
std::cout << "[ ";
for (const auto &v : vect)
std::cout << v << " ";
std::cout << "]\n";
}
输出:
[ 1 0 1 ]
而如果我只更改第一个模板参数(从 bool
到 int
),它就可以正常工作:
using Varval = boost::variant<int, std::string>;
void main()
{
std::vector<Varval> vect{ true, false, "Hello_World" };
std::cout << "[ ";
for (const auto &v : vect)
std::cout << v << " ";
std::cout << "]\n";
}
正确输出:
[ 1 0 Hello_World ]
有什么想法吗?
最佳答案
boost::variant
对于每种指定类型都有一个构造函数重载。在第一个示例中,将有一个 bool
重载和一个 std::string
重载。您现在使用 char[n]
调用构造函数,该构造函数可以隐式转换为这两者。因此,没有完美的匹配,只有两个候选人。但编译器不会告诉您该调用不明确,而是选择 bool
重载作为更好的匹配。
在使用 int
和 std::string
的第二个示例中,您传递的是 bool
和 char[n]
到构造函数。 bool
可以隐式转换为 int
,但不能转换为 std::string
。 char[n]
可以隐式转换为 std::string
,但不能转换为 int
。因此,相应的构造函数被调用,因为每个构造函数只有一个候选者。
关于c++ - boost::带有 bool 和 string 的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957837/