Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用;“自动”;推断嵌套初始值设定项列表的类型_C++_Initializer List_Auto_Type Deduction - Fatal编程技术网

C++ 使用;“自动”;推断嵌套初始值设定项列表的类型

C++ 使用;“自动”;推断嵌套初始值设定项列表的类型,c++,initializer-list,auto,type-deduction,C++,Initializer List,Auto,Type Deduction,我试图使用auto自动推断嵌套std::initializer\u list的类型 auto list = { {{ 0, 1}, { 2, 3 }}, {{ 4, 5}, { 6, 7 }}, }; 这里的实际类型是std::initializer\u list,但是当我试图编译它时,我得到一个错误,指出auto无法推断类型。有没有办法让auto识别这样的构造 我有一个程序,其中这些初始值设定项列表可以是任意大小和深度的,因此硬编码类型是不实际的 其他信息: 我在这里找到了有

我试图使用
auto
自动推断嵌套
std::initializer\u list
的类型

auto list = {
    {{ 0, 1}, { 2, 3 }},
    {{ 4, 5}, { 6, 7 }},
};
这里的实际类型是
std::initializer\u list
,但是当我试图编译它时,我得到一个错误,指出
auto
无法推断类型。有没有办法让
auto
识别这样的构造

我有一个程序,其中这些初始值设定项列表可以是任意大小和深度的,因此硬编码类型是不实际的

其他信息: 我在这里找到了有关初始值设定项列表的文档:

大括号的init列表不是表达式,因此没有类型,例如,
decltype({1,2})
格式不正确。没有类型意味着模板类型推断无法推断出与大括号init列表匹配的类型,因此给定声明
模板void f(T)
表达式
f({1,2,3})
格式不正确。但是,模板参数可以通过其他方式推导,就像
std::vector v(std::istream_iterator(std::cin),{})
的情况一样,其中迭代器类型由第一个参数推导,但也用于第二个参数位置。对于使用关键字auto的类型推断,有一个特殊的例外,它在复制列表初始化中将任何带括号的init列表推断为
std::initializer\u list

文档似乎表明,对于使用
auto
的类型推断,有一个特殊的例外,因此您可能会认为这是可行的。。。但是,当您使用嵌套列表时,
auto
似乎无法推断类型

我有一个程序,其中这些初始值设定项列表可以是任意大小和深度的,因此硬编码类型是不实际的

然后你需要解决这个问题

您不应该认为带括号的init列表是一种快速而肮脏的方法,可以在不考虑其类型的情况下生成值数组。那不是他们的目的。它们的目的是初始化值。类型
std::initializer\u list
旨在作为初始化某些类型过程中的中间阶段(这就是为什么在列表初始化中为使用单个
initializer\u list
的构造函数赋予特殊含义的原因)

如果你想拥有不同深度的数组,那么你需要弄清楚这个构造需要哪种类型,然后把它输入出来
auto
只能推断一个带括号的初始列表级别;如果需要更深层次,则需要显式指定类型

使用
auto

是的,有。但它只适用于为
auto
本身推导列表,而不适用于
auto
的推导需要的任何东西

顺序为
autolist={{1,2,3}
要工作,编译器必须推导两种类型:用于
{1,2,3}
的类型和用于
列表的类型。
列表
的类型推导需要推导嵌套的大括号init列表的类型。但是您无法推断带括号的init列表的类型。因此它不起作用


还应该指出的是,即使它真的起作用了,也不会真正起作用。原因是
列表
中的
初始值设定项\u list
将引用临时数组。将在初始化表达式结束时销毁的临时数组。这与为什么
string_view sv=std::string(“foo”)不会产生有用的东西。

如果您知道类型,就声明它。使用
auto
似乎很懒,就像允许使用
var
关键字的语言中使用的糟糕的编程策略一样。C++是一种类型化语言,这意味着每个变量都有一个类型,一旦声明了就不能更改。除非您的代码文件可以包含多少字符,否则只需声明类型并使用它即可。@JoelTrauger阅读问题的最后一句话。大小/深度可能会有所不同。在任何地方硬编码类型都不是一个选项,因为类型并不总是相同的。我不完全确定,但我认为即使手动指定类型,也会得到一个“悬空”初始值设定项列表。请参阅和@JoelTrauger我不是在寻找运行时的灵活性,这是编译时的灵活性<代码>自动
在编译时而不是运行时推断类型。@JoelTrauger这既不是“糟糕”也不是“懒惰的编程策略”。它使用了预期的强类型,这对程序员来说是一个福音,而不是一个语法障碍。查看具有高级类型系统的语言,例如Haskell和Ocaml,了解它们是如何处理这个问题的。哪里有文件证明,
auto
只能推导单级带括号的init列表?我知道这可能是真的,但是我在任何地方的文档中都找不到明确的说明。@tjwrona1992:您在这里寻找什么样的文档?标准中的任何官方文件或可信的网站,如cppreference,都说明了如果您尝试使用
auto
推断嵌套初始值设定项列表的类型,会发生什么情况。它说,对于带有初始值设定项列表的
auto
,有特殊的类型推断规则,所以它应该可以工作,但它没有说明为什么它不适用于嵌套列表。@tjwrona1992:“标准中的任何官方规定,如果您试图使用auto推断嵌套初始值设定项列表的类型,应该发生什么。”这不是标准的工作方式。对于专门用于推断
auto
变量的嵌套大括号init列表,没有特殊规则。对于用于
auto
变量的大括号init列表有一个特殊规则,但是大括号init列表中的大括号init列表不会神奇地得到特殊处理,因为外部列表恰好与
auto
变量一起使用。好吧,我想我明白你的意思了