如果您有一个std::variant
具有重复类型的,您如何分配给它?std::variant
看似允许重复类型。
std::variant<int,int> foo;
编译成功,但我不确定如何分配给foo
,如果我想分配给变体中的特定条目,就更是如此。
我尝试过:
std::variant<int,int> foo;
foo = 1;
编译失败,错误=
为未定义的std::variant<int,int>
。
std::variant<int,int> foo;
get<foo, 0> = 1;
编译失败,错误为缺乏足够的上下文类型信息来确定类型。
我想要类似的东西
std::variant<int,int> foo;
something<foo, 1> = 10
assert(foo.index == 1);
assert(get<1>(foo) == 10);
这会将变体置于第 0 个替代方案处于活动状态且其值为 1:
请注意,的语义
emplace
通常与赋值的语义不同。赋值运算符首先检查当前活动的备选方案是否与赋值后应该活动的备选方案相同。如果是,则它简单地分配给现有备选方案。相反,emplace
始终先销毁当前活动的备选方案,然后构造一个备选方案,即使新备选方案具有与旧备选方案相同的索引。要使用赋值语义,您可以执行以下操作:对于整数来说,这没有什么区别,但对于更复杂的类型,赋值有时比销毁对象并创建具有所需值的新对象更有效。