如何直接初始化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
相关产品推荐
相关产品推荐

