为什么不能简单初始化(带大括号)2D std::array?

2024-05-12C/C++开发问题
0

本文介绍了为什么不能简单初始化(带大括号)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, 2u>'

为什么我不能使用这种语法?

我找到了一些变通方法,一个非常有趣的额外括号,但只是想知道为什么第一种最简单的方法无效?

解决方法:

//额外的大括号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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

无法访问 C++ std::set 中对象的非常量成员函数
Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)...
2024-08-14 C/C++开发问题
17

从 lambda 构造 std::function 参数
Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)...
2024-08-14 C/C++开发问题
25

STL BigInt 类实现
STL BigInt class implementation(STL BigInt 类实现)...
2024-08-14 C/C++开发问题
3

使用 std::atomic 和 std::condition_variable 同步不可靠
Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)...
2024-08-14 C/C++开发问题
17

在 STL 中将列表元素移动到末尾
Move list element to the end in STL(在 STL 中将列表元素移动到末尾)...
2024-08-14 C/C++开发问题
9

为什么禁止对存储在 STL 容器中的类重载 operator&amp;()?
Why is overloading operatoramp;() prohibited for classes stored in STL containers?(为什么禁止对存储在 STL 容器中的类重载 operatoramp;()?)...
2024-08-14 C/C++开发问题
6