无法使用 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" } });
我使用起来不是很熟练 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" } });