首页 > 解决方案 > 如何使用初始化列表来初始化 std::variant?

问题描述

初始化列表的非变体版本效果很好:

std::map<int, double> a = {{1,0.1}};

但是变体版本没有:

std::variant<std::map<int, double>, int> b = {{1,0.1}};

有没有办法使用初始化列表初始化 b ?如果没有,初始化它的最佳方法是什么?

标签: c++c++17

解决方案


一种方法是更具体:

std::variant<std::map<int, double>, int> b = std::map<int, double>{{1,0.1}};

不理想,但编译器无法std::variant从 a 中选择正确的构造函数重载<brace-enclosed initializer list>。由于相关std::variant构造函数的定义方式:

template< class T >
constexpr variant( T&& t ) noexcept(/* see below */);

T&& t不可能匹配 a <brace-enclosed initializer list>,只能匹配特定类型的值。


推荐阅读