initializer_list 的 c++ 构造函数重载歧义

c++ Constructor overload ambiguity with initializer_list

我有一个 class 有两个构造函数:

myclass(std::initializer_list<int>);
myclass(std::initializer_list<std::initializer_list<int>);

以下声明有效

myclass obj1 = {{1,2},{3,4},{5,6}}; //a 3x2 matrix
myclass obj2 = {{1,2,3}}; // a 1x3 matrix

但是下面的声明不起作用,当我尝试编译时,它说它有歧义

myclass obj3 = {{1},{2},{3}};  //a 3x1 matrix

以下解决问题:

myclass obj3 = {std::initializer_list<int>({1}), 
                std::initializer_list<int>({2}), 
                std::initializer_list<int>({3})};

但我觉得这个解决方案不舒服而且丑陋。有没有可能做得更好?

编译器说 {{1},{2},{3}} 不明确的原因是 {1} 可以是 intstd::initializer_list<int>。所以你要么有一个 int 的列表,要么有一个 int 的列表,编译器无法决定你真正想要什么

当您执行 {{{1},{2},{3}}}{{{1}},{{2}},{{3}}} 时,最里面的大括号表示 int,下一个最里面的大括号表示这些 int 的列表,然后最外面的大括号表示该列表的列表。您需要这些额外的大括号来消除编译器的歧义。