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

时间:2010-04-22 01:38:03

标签: c++ boost

我想了解boost array。可以从作者的网站轻松阅读code

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

boost::array<int,4> a = { { 1, 2, 3 } };  // Line 1
boost::array<int,4> a = { 1, 2, 3 };      // Line 2

在我使用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'

尽管如此,我的主要问题是,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>&)

有人可以解释一下吗?在第1行中是否有一些特定的提升事件需要注意?

2 个答案:

答案 0 :(得分:20)

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

Boost数组定义如下:

struct array { T elems[N]; };

内部大括号用于elems数组初始化,outear大括号用于struct初始化。 如果您提供自己的构造函数,则不再具有使用大括号

初始化的普通旧数据类型

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

答案 1 :(得分:9)

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

  
      
  1. 聚合是一个没有用户声明的数组或类(第9节)   构造函数(12.1),没有私有或   受保护的非静态数据成员   (第11条),没有基类(条款   10),没有虚函数(10.3)。
  2.   
  3. 初始化聚合时,初始化程序可以包含   initializer-clause由a组成   括号,逗号分隔列表   成员的初始化子条款   汇总的,写的   增加下标或成员顺序。   如果聚合包含   subreggregates,此规则适用   递归地向子集合的成员。
  4.   

GCC 4.1.2可能违反了第11段。

  

11支撑可以省略   初始化列表如下。如果   initializer-list以左开头   支撑,然后成功   逗号分隔的初始化列表   初始化a的成员   子聚集;这是错误的   有更多的初始化者   成员。但是,如果   subaggregate的初始化列表   那么,不是以左支撑开始   列表中只有足够的初始值设定项   被用来初始化成员   分团;剩下的   初始化器被初始化   聚合的下一个成员   当前的子聚合是一个   构件。