You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接初始化C++ std::variant为非默认选项实例(无拷贝无额外构造)

直接初始化std::variant为非默认选项的方法

要直接初始化MyVariant为Bar类型、不触发拷贝且不构造Foo,可以使用C++17为std::variant提供的原位构造标签:std::in_place_type或std::in_place_index,这两种方式都会在variant的内部存储空间直接构造目标类型对象,完全符合你的要求。

方法1:使用std::in_place_type指定类型

直接通过类型名明确要构造的备选类型,传入该类型的构造参数即可:

MyVariant var{std::in_place_type<Bar>, 42};

方法2:使用std::in_place_index指定索引

根据Bar在std::variant模板参数中的位置(索引从0开始,这里Bar是第2个类型,索引为1),用索引指定要构造的类型:

MyVariant var{std::in_place_index<1>, 42};

完整示例代码

#include <variant>

class Foo {
    // 类内部实现
public:
    Foo(int) {}
};

class Bar {
    // 类内部实现
public:
    Bar(int) {}
};

using MyVariant = std::variant<Foo, Bar>;

int main() {
    // 原位构造Bar类型实例,无拷贝、无Foo构造
    MyVariant bar_var{std::in_place_type<Bar>, 123};
    
    // 也可以用索引方式
    MyVariant bar_var2{std::in_place_index<1>, 456};
    
    return 0;
}

说明

  • 这两种方式都属于原位构造,variant会直接在自身的内存区域构造Bar对象,不会产生临时对象,因此没有拷贝/移动操作。
  • 整个过程不会触及Foo类型,完全不会构造Foo的实例。
  • 该特性要求编译器支持C17及以上标准(std::variant本身就是C17引入的)。

内容的提问来源于stack exchange,提问作者Julien BERNARD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:06:33