这里的问题是std::initializer_list
不能从转发参考。事实上,明确指定std::initializer_list
使您的代码编译:
M m1{
std::initializer_list<std::string>{"hello", "world"},
std::initializer_list<std::pair<const std::string, std::string>>{{"hello", "world" },{"world", "hello"} },
"hello"};
魔杖盒示例 http://melpon.org/wandbox/permlink/eqRqGmU3sRPuqux8
您可以找到有关以下内容的更多信息std::initializer_list
和扣除在这个问题中 https://stackoverflow.com/questions/12431495/initializer-list-and-template-type-deduction.
您可以强制扣除std::initializer_list
通过创建一个助手make_il
功能:
template <typename... Ts>
auto make_il(Ts&&... xs)
{
return std::initializer_list<std::common_type_t<Ts...>>{
std::forward<Ts>(xs)...};
}
您的最终代码将如下所示:
using namespace std::literals::string_literals;
using kvp = std::pair<const std::string, std::string>;
M m1{
make_il("hello"s, "world"s),
make_il(kvp("hello"s, "world"s), kvp("world"s, "hello"s)),
"hello"};
魔杖盒示例 http://melpon.org/wandbox/permlink/EKjdtlIY2ZW912bl