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}
可以是 int
或 std::initializer_list<int>
。所以你要么有一个 int
的列表,要么有一个 int
的列表,编译器无法决定你真正想要什么
当您执行 {{{1},{2},{3}}}
或 {{{1}},{{2}},{{3}}}
时,最里面的大括号表示 int
,下一个最里面的大括号表示这些 int
的列表,然后最外面的大括号表示该列表的列表。您需要这些额外的大括号来消除编译器的歧义。
我有一个 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}
可以是 int
或 std::initializer_list<int>
。所以你要么有一个 int
的列表,要么有一个 int
的列表,编译器无法决定你真正想要什么
当您执行 {{{1},{2},{3}}}
或 {{{1}},{{2}},{{3}}}
时,最里面的大括号表示 int
,下一个最里面的大括号表示这些 int
的列表,然后最外面的大括号表示该列表的列表。您需要这些额外的大括号来消除编译器的歧义。