我一直在阅读有关Boost Variant的所有信息。 (我很头疼。)有些人感到惊讶的是,分配字符串文字被保存为bool。如果我在char*
(之后?)之前列出了bool
,那么字符串文字会保存为char*
字符串吗? v1
和v2
之间的排序是否重要?
boost::variant<char*, bool> v1 = "hello";
boost::variant<bool, char*> v2 = "hello";
对于整数,我应该只为所有整数绑定最大的整数,还是应该单独绑定int8_t
到int64_t
?如果我将它们全部绑定然后输入一个适合其中任何一个,它会被保存为第一个(最后一个?)吗?
float
vs double
怎么样?
答案 0 :(得分:2)
没有魔力。
只有构造函数的记录行为。
template<typename T> variant(T & operand);
需要:T必须明确可转换为其中一种有界类型(即T1,T2等)。
后置条件:*这是操作数到其中一个有界类型的最佳转换,由标准重载决策规则决定。
引发:可能会因操作数转换为其中一个有界类型而导致任何异常失败。
由于两种情况都涉及隐式转换,因此可能会构造出意外的元素类型。
见下面的例子
<强> Live On Coliru 强>
#include <boost/variant.hpp>
int main() {
{
boost::variant<bool, std::string> v;
v = "hello"; // is char const(&)[6], converts to bool
assert(0 == v.which());
v = static_cast<char const*>("hello");
assert(0 == v.which());
}
// compare to
{
boost::variant<bool, char const*> v;
v = "hello"; // is char const(&)[6]
assert(1 == v.which()); // now selects the direct match
v = static_cast<char const*>("hello");
assert(1 == v.which());
}
}