我正在尝试使用auto
自动推断出嵌套std::initializer_list
的类型。
auto list = {
{{ 0,1},{ 2,3 }},{{ 4,5},{ 6,7 }},};
这里的实际类型是std::initializer_list<std::initializer_list<std::initializer_list<int>>>
,但是当我尝试对其进行编译时,出现错误,指出auto
无法推断出类型。有没有办法让auto
来识别这样的构造?
我有一个程序,其中这些初始化程序列表可以具有任意大小和深度,因此对这些类型进行硬编码是不现实的。
其他信息:
我在这里找到有关初始化程序列表的文档:https://en.cppreference.com/w/cpp/language/list_initialization
braced-init-list不是表达式,因此没有类型,例如
decltype({1,2})
格式错误。没有类型意味着模板类型推导无法推导与括号初始列表匹配的类型,因此在声明为template<class T> void f(T);
的情况下,表达式f({1,2,3})
的格式不正确。但是,可以像std::vector<int> v(std::istream_iterator<int>(std::cin),{})
一样推导模板参数,其中迭代器类型由第一个参数推导出,但也用于第二个参数位置。使用关键字auto进行类型推导时有一个特殊的例外,它会在复制列表初始化中将任何括号初始列表推导出为std::initializer_list
。
文档似乎建议使用auto
进行类型推导有一个特殊的例外,因此您会认为这是可行的...但是似乎当您使用嵌套列表auto
时无法推断类型。