使用“自动”来推断嵌套的初始化程序列表的类型

我正在尝试使用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时无法推断类型。

DtutuXsongshu 回答:使用“自动”来推断嵌套的初始化程序列表的类型

  

我有一个程序,其中这些初始化程序列表可以具有任意大小和深度,因此对这些类型进行硬编码是不现实的。

然后您需要解决该问题。

您不应该将括号初始化列表看作是在无需考虑它们的类型的情况下快速创建值数组的方法。那不是他们的目的。它们的目的是初始化值。类型std::initializer_list打算在初始化某种类型的过程中作为中间阶段(这就是为什么使用单个initializer_list的构造函数在列表初始化中具有特殊含义的原因。

如果要具有各种深度等的数组数组,则需要弄清楚该构造需要是哪种类型并键入。 auto只能得出一个级别的braced-init-list;如果需要更深的层次,则需要明确指定类型。

  

使用auto

进行类型推导有一个特殊例外

是的,有。但这仅适用于推导出auto 的列表,不适用于推论auto所需的任何内容。

为了使auto list = {{1,2,3}};工作,编译器必须推断出两种类型:用于{1,3}的类型和用于{{1 }}。推导list的类型需要推导嵌套的braced-init-list的类型。但是您不能推断出括号初始列表的类型。因此,它不起作用。

还应该注意的是,即使它确实起作用了,它实际上也不会起作用。原因是list内部的initializer_list会引用一个临时数组。一个临时数组,将在初始化表达式的末尾销毁。基本上与list无法产生有用信息的原因相同。

本文链接:https://www.f2er.com/2865975.html

大家都在问