如何使用初始化列表来初始化 std::variant?

时间:2021-02-12 01:15:32

标签: c++ c++17

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

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

但变体版本没有:

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

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

1 个答案:

答案 0 :(得分:5)

一种方法是更具体:

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

不理想,但编译器无法从 std::variant 中选择正确的 <brace-enclosed initializer list> 构造函数重载。因为相关的 std::variant constructor 是如何定义的:

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

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