Why can#39;t simple initialize (with braces) 2D std::array?(为什么不能简单初始化(带大括号)2D std::array?)
问题描述
<块引用>可能的重复:
c++ 为什么 std::vector 的 initializer_list 行为和std::array 不同
我定义了简单的二维数组(3X2):
std::array,2>一个 {{1,2,3},{4,5,6}};
我很惊讶这个初始化不起作用,gcc4.5 错误:too many initializers for 'std::array
>
为什么我不能使用这种语法?
我找到了一些变通方法,一个非常有趣的额外括号,但只是想知道为什么第一种最简单的方法无效?
解决方法:
//额外的大括号std::array,2>一个 {{{1,2,3},{4,5,6}}};//显式转换std::array,2>一个 {std::array{1,2,3},std::array{4,5,6}};
[更新]
好的,感谢 KerrekSB 和评论,我明白了.所以看起来我的例子中大括号太少了,就像这个C例子一样:
struct B {整数数组[3];};结构体{B数组[2];};B b = {{1,2,3}};A a = {{{{1,2,3}},{{4,5,6}}}};
std::array
是一个集合,包含一个 C 数组.要初始化它,您需要为类本身使用外大括号,为 C 数组使用内大括号:
std::arraya1 = { { 1, 2, 3 } };
将此逻辑应用于二维数组给出:
std::array, 2>a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } };//^ ^ ^ ^ ^ ^//||||||//|+-|-+------------|-+//+-|-+-|------------+---- C++类大括号//||//+---+--- 成员 C 数组大括号
Possible Duplicate:
c++ why initializer_list behavior for std::vector and std::array are different
I defined simple 2D array (3X2):
std::array<std::array<int,3>,2> a {
{1,2,3},
{4,5,6}
};
I was surprised this initialization does not work, with gcc4.5 error: too many initializers for 'std::array<std::array<int, 3u>, 2u>'
Why can't I use this syntax?
I found workarounds, one very funny with extra braces, but just wonder why the first, easiest approach is not valid?
Workarounds:
// EXTRA BRACES
std::array<std::array<int,3>,2> a {{
{1,2,3},
{4,5,6}
}};
// EXPLICIT CASTING
std::array<std::array<int,3>,2> a {
std::array<int,3>{1,2,3},
std::array<int,3>{4,5,6}
};
[UPDATE]
Ok, thanks to KerrekSB and comments I get the difference. So it seems that there is too little braces in my example, like in this C example:
struct B {
int array[3];
};
struct A {
B array[2];
};
B b = {{1,2,3}};
A a = {{
{{1,2,3}},
{{4,5,6}}
}};
std::array<T, N>
is an aggregate that contains a C array. To initialize it, you need outer braces for the class itself and inner braces for the C array:
std::array<int, 3> a1 = { { 1, 2, 3 } };
Applying this logic to a 2D array gives this:
std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } };
// ^ ^ ^ ^ ^ ^
// | | | | | |
// | +-|-+------------|-+
// +-|-+-|------------+---- C++ class braces
// | |
// +---+--- member C array braces
这篇关于为什么不能简单初始化(带大括号)2D std::array?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么不能简单初始化(带大括号)2D std::array?


基础教程推荐
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01