我应该如何初始化boost :: array?

Aru*_*run 14 c++ boost

我想了解boost数组.该代码可以轻松地从作者的网站上阅读.

在设计原理中,作者(Nicolai M. Josuttis)提到以下两种类型的初始化是可能的.

boost::array<int,4> a = { { 1, 2, 3 } };  // Line 1
boost::array<int,4> a = { 1, 2, 3 };      // Line 2
Run Code Online (Sandbox Code Playgroud)

在我使用g ++(版本4.1.2)的实验中,第1行正在运行但第2行则没有.(第2行产生以下结果:

warning: missing braces around initializer for 'int [4]'
warning: missing initializer for member 'boost::array<int, 4ul>::elems'
Run Code Online (Sandbox Code Playgroud)

)

不过,我的主要问题是,1号线是如何工作的?我试着编写一个类似于array.hpp的类,并使用类似于第1行的语句,但这不起作用:-(.错误是

typedef array< unsigned int, 10 > MyArray;

MyArray b = { { 1, 2, 3 } };  // Line 74

array_test.cpp:74: error: in C++98 'b' must be initialized by constructor, not by '{...}'
array_test.cpp:74: error: no matching function for call to 'array<unsigned int, 10u>::array(<brace-enclosed initializer list>)'
array.h:16: note: candidates are: array<unsigned int, 10u>::array()
array.h:16: note:                 array<unsigned int, 10u>::array(const array<unsigned int, 10u>&)
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?在第1行中我是否需要注意一些具体的增强功能?

Any*_*orn 20

这是一个常规的大括号初始化列表:

Boost数组的定义如下:

struct array { T elems[N]; };
Run Code Online (Sandbox Code Playgroud)

inner brace用于elems数组初始化,outear brace用于struct初始化.如果您提供自己的构造函数,则不再使用普通的旧数据类型,无法使用大括号进行初始化

注意你可以没有外支架,但你会收到警告


Pot*_*ter 9

标准的相关部分是§8.5.1,聚合.

  1. 聚合是一个数组或类(第9节),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11节),没有基类(第10节),也没有虚函数(10.3).
  2. 初始化聚合时,初始化程序可以包含一个initializer子句,该子句由一个括号括起来的逗号分隔的聚合成员初始化子句列表组成,以增加的下标或成员顺序编写.如果聚合包含子聚合,则此规则将递归地应用于子聚合的成员.

GCC 4.1.2可能违反了第11段.

11可以在初始化列表中省略大括号,如下所示.如果初始化列表以左括号开头,则后续的以逗号分隔的初始化列表初始化子聚合的成员; 如果有比成员更多的初始化者是错误的.但是,如果子聚合的初始化列表不以左括号开头,则只从列表中获取足够的初始值以初始化子聚合的成员; 剩余的任何初始值设定项都用于初始化当前子聚合为成员的聚合的下一个成员.