代码之家  ›  专栏  ›  技术社区  ›  Arun

如何初始化boost::数组?

  •  14
  • Arun  · 技术社区  · 15 年前

    我试图理解 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 回复  |  直到 15 年前
        1
  •  20
  •   Anycorn    15 年前

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

    Boost数组的定义如下:

    struct array { T elems[N]; };
    

    内部大括号用于元素数组初始化,外部大括号用于结构初始化。 如果您提供自己的构造函数,则不再具有任何无法使用大括号初始化的纯旧数据类型。

    注意,你可以不用外支架,但你会得到警告。

        2
  •  9
  •   Potatoswatter    15 年前

    本标准的相关章节为§8.5.1《集料》。

    1. 聚合是一个没有声明用户的数组或类(第9条)。 施工人员(12.1),无私人或 保护的非静态数据成员 (第11条),无基类(第11条) 10),无虚拟功能(10.3)。
    2. 初始化聚合时,初始值设定项可以包含 初始值设定项子句由 大括号-带逗号分隔的列表 成员的初始值设定项子句 总的,写在 增加下标或成员顺序。 如果集合包含 子聚合,此规则适用 递归到子聚合的成员。

    一般合同条款第4.1.2款可能违反第11款。

    11个大括号可以在 初始值设定项列表如下。如果 初始值设定项列表以左开头 支撑,然后是成功的 初始值设定项的逗号分隔列表 初始化 次聚集;它是错误的 初始值设定项多于 成员。但是,如果 子聚合的初始值设定项列表 不是从左大括号开始,然后 列表中只有足够的初始值设定项 用于初始化的成员 亚集合体;任何剩余的 初始值设定项留给初始化 集合的下一个成员 当前的子聚集是 成员。