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

问题描述 投票:1回答:1

我正在尝试使用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

括号初始列表不是表达式,因此没有类型,例如decltype({1,2})格式错误。没有类型意味着模板类型的推导不能推断出与支撑初始列表匹配的类型,因此给定声明模板void f(T);表达式f({1,2,3})的格式不正确。但是,可以另外推导出template参数,如std :: vector v(std :: istream_iterator(std :: cin),{})的情况一样,其中迭代器类型由第一个参数推导,但也用于第二个参数位置。使用关键字auto进行类型推导时有一个特殊的例外,它会在复制列表初始化中将任何括号初始列表推导为std :: initializer_list。

该文档似乎建议使用auto进行类型推导有一个特殊的例外,因此您会认为这是可行的...但是,当您使用嵌套列表auto时,似乎无法推断出类型。

c++ initializer-list auto type-deduction
1个回答
0
投票

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

然后您需要解决该问题。

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

如果要具有各种深度等的数组的数组,那么您将需要弄清楚该构造需要是哪种类型并将其键入。 auto只能推导单个支撑列表。如果需要更深层次的内容,则需要明确指定类型。

(在C ++ 17中也不会将单元素的括号初始列表推导出为initializer_list。也就是说,auto i = {2}使i成为int,而不是initializer_list<int>

© www.soinside.com 2019 - 2024. All rights reserved.