我不知道为啥我不能在 C++ 中初始化一个数组的数组
Posted
技术标签:
【中文标题】我不知道为啥我不能在 C++ 中初始化一个数组的数组【英文标题】:I don't know why I can't initialize an array of an array in C++我不知道为什么我不能在 C++ 中初始化一个数组的数组 【发布时间】:2021-08-18 21:21:37 【问题描述】:我有这段 C++ 代码:
std::array<std::array<int, 2>, 4> elements = 1,2,1,2,1,2,1,2;
它说:错误:结构初始化程序中的多余元素
我不知道为什么会这样。如果我写它有效:
std::array<std::array<int, 2>, 4> elements = 1,2;
【问题讨论】:
【参考方案1】:要初始化std::array
对象,您需要两个花括号对:外花括号用于对象本身,内花括号用于数组。
这意味着你的初始化需要看起来像
std::array<std::array<int, 2>, 4> elements = 1,2,1,2,1,2,1,2;
【讨论】:
【参考方案2】:std::array
在aggregate initialization 中是微妙的;它期望子对象(底层数组)有更多大括号。
std::array<std::array<int, 2>, 4> elements = 1,2,1,2,1,2,1,2;
// ^ ^ <- for std::array
// ^ ^ <- for underlying array
初始化器 1,2,1,2,1,2,1,2
出现错误,因为有 4 个 1,2
s 来初始化子对象(底层数组),但 std::array
只有一个,即多余的元素。
【讨论】:
【参考方案3】:以下是一些示例,您可以如何初始化您正在使用的类型的对象。
#include <iostream>
#include <array>
int main()
std::array<std::array<int, 2>, 4> elements1 = 1, 2, 1, 2, 1, 2, 1, 2 ;
std::array<std::array<int, 2>, 4> elements2 = 1, 2, 1, 2, 1, 2, 1, 2 ;
std::array<std::array<int, 2>, 4> elements3 =
1, 2 , 1, 2 , 1, 2 , 1, 2
;
std::array<std::array<int, 2>, 4> elements4 =
1, 2 , 1, 2 , 1, 2 , 1, 2
;
std::array<std::array<int, 2>, 4> elements5 =
1, 2 , 1, 2, 1, 2, 1, 2
;
return 0;
注意以下来自 C++ 17 标准(11.6.1 聚合)的引用
12 大括号可以在初始化列表中被省略,如下所示。如果 initializer-list 以左大括号开头,然后是后面的 初始化子句的逗号分隔列表初始化元素 子聚合的;有更多是错误的 初始化子句比元素。但是,如果初始化器列表 对于子聚合不以左大括号开头,那么就足够了 列表中的初始化子句用于初始化元素 子集合的;任何剩余的初始化子句都留给 初始化当前聚合的下一个元素 子聚合是一个元素。
std::array
定义为包含另一个聚合的聚合。
这是一个演示程序,使引用更清晰,显示了二维数组的初始化
#include <iostream>
int main()
const size_t M = 4, N = 4;
int a[M][N] =
1, 2, 3, 4 ,
5, 6, 7, 8,
8, 7, 6, 5 ,
4, 3, 2, 1,
;
return 0;
您可以将std::array<std::array<int, 2>, 4 >
类型的表示想象为以下演示程序中结构 B 的声明。
#include <iostream>
struct A
int a[2];
;
struct B
A b[4];
;
int main()
B b1 =
;
B b2 =
;
B b3 =
;
B b4 =
,
;
return 0;
调查程序。
【讨论】:
我不明白你的代码为什么有效。它是一个数组数组,数组的每个元素都是一个数组,用 表示。 @MartíSerra 请参阅我的回答中提供的 C++ 17 标准的引用。以上是关于我不知道为啥我不能在 C++ 中初始化一个数组的数组的主要内容,如果未能解决你的问题,请参考以下文章