1

我对使用 std::variant 不是很熟练,也不能完全理解所有构造函数的情况。

using map_type = std::multimap<std::string, std::string>;
using union_type = std::variant<std::string, map_type>;

void foo(union_type)
{
...
}

void foo2(map_type)
{
...
}

int main()
{
  foo({ {"key", "val"} }); // gives error "no instance of constructor"
  foo2({ {"key", "val"} }); // works fine
  foo2(map_type{ {"key", "val"} }); // works fine
}

正如我可以推断出的,这里调用了构造函数,但不明白什么条件不满足。有人可以解释一下吗?

PS是否有一些文章或来源可以阅读更多信息和使用变体的示例?

4

2 回答 2

3

多映射构造函数模板的模板参数推导失败,因为花括号初始化列表没有 type

您必须明确提供此信息,创建一个未命名的临时对象,该对象在大多数情况下仅存在于编译时(对于您的代码):

foo(map_type{ { "key", "value" } });
于 2021-08-24T14:36:29.547 回答
2

问题是大括号封闭的初始化列表没有类型,因此构造函数union_type无法T为这种情况推导出 a 。

foo({ std::in_place_type<map_type>, { {"key", "val"} } });无法推断出std::initialiser_list解析为该构造函数的特化。

于 2021-08-24T13:30:50.027 回答