无法使用 initializer_list 调用带有变体参数的函数

Can't call function with variant parameter using initializer_list

我使用起来不是很熟练 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
}

我可以推断这里调用了constructor,但不明白什么条件不满足。有人可以解释一下吗?

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

问题是 大括号括起来的初始化列表 没有类型,所以 union_type 的构造函数无法推导出 T那种情况。

foo({ std::in_place_type<map_type>, { {"key", "val"} } }); 也不能推导出 std::initialiser_list 的特化来解析那个构造函数。

multimap 构造函数模板的模板参数推导失败,因为 braced-init-lists do not have a type.

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

foo(map_type{ { "key", "value" } });