我遇到麻烦了boost::variant
(使用升压1.67.0)。
当我的模板参数列表包含两者时bool
and std::string
,任何应被视为字符串的变体对象似乎都隐式绑定到 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";
}
Outputs:
[ 1 0 1 ]
而如果我只更改第一个模板参数,则从bool
to 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 你好世界 ]
有任何想法吗?
boost::variant
每个指定类型都有一个构造函数重载。在你的第一个例子中,会有一个重载bool
和一个用于std::string
。您现在正在使用char[n]
可以隐式转换为两者。因此,没有完美的匹配,只有两个候选人。但编译器不会告诉您该调用是不明确的,而是选择bool
过载作为更好的匹配。
为什么?这已经是完美的答案了在这个问题中.
在你的第二个例子中int
and std::string
你正在路过bool
s and char[n]
给构造函数。bool
可以隐式转换为int
但不std::string
. char[n]
可以隐式转换为std::string
但不int
。因此,相应的构造函数被调用,因为每个构造函数只有一个候选者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)