我想了解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行中是否有一些特定的提升事件需要注意?
答案 0 :(得分:20)
这是常规大括号初始化列表:
Boost数组定义如下:
struct array { T elems[N]; };
内部大括号用于elems数组初始化,outear大括号用于struct初始化。 如果您提供自己的构造函数,则不再具有使用大括号
初始化的普通旧数据类型请注意,你可以没有外支撑,但你会收到警告
答案 1 :(得分:9)
标准的相关部分是§8.5.1,聚合。
- 聚合是一个没有用户声明的数组或类(第9节) 构造函数(12.1),没有私有或 受保护的非静态数据成员 (第11条),没有基类(条款 10),没有虚函数(10.3)。
- 初始化聚合时,初始化程序可以包含 initializer-clause由a组成 括号,逗号分隔列表 成员的初始化子条款 汇总的,写的 增加下标或成员顺序。 如果聚合包含 subreggregates,此规则适用 递归地向子集合的成员。
醇>
GCC 4.1.2可能违反了第11段。
11支撑可以省略 初始化列表如下。如果 initializer-list以左开头 支撑,然后成功 逗号分隔的初始化列表 初始化a的成员 子聚集;这是错误的 有更多的初始化者 成员。但是,如果 subaggregate的初始化列表 那么,不是以左支撑开始 列表中只有足够的初始值设定项 被用来初始化成员 分团;剩下的 初始化器被初始化 聚合的下一个成员 当前的子聚合是一个 构件。