【问题标题】:How should I initialize a boost::array?我应该如何初始化 boost::array?
【发布时间】:2010-04-22 01:38:02
【问题描述】:

我正在尝试理解boost arraycode 可以从作者的网站上轻松阅读。

在设计原理中,作者 (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 行中发生的某些特定于提升的事情吗?

【问题讨论】:

  • 正如 Potatoswatter 提到的,这仅适用于 POD 类型。然而,可能值得注意的是,即将到来的 C++0x 规范提供了支持具有非 pod 类型的初始化列表的方法。
  • 你的类中可能有构造函数或私有字段
  • + 1 @aaa:非常感谢。是的,我的数组(数据)在我的课堂上是私有的。

标签: c++ boost


【解决方案1】:

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

Boost 数组定义如下:

struct array { T elems[N]; };

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

请注意,您可以不使用外括号,但会收到警告

【讨论】:

  • +1:感谢内大括号和外大括号的解释。
  • 我接受这个答案是因为这个答案以及同一作者对该问题的评论确实帮助我解决了我的问题。
【解决方案2】:

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

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

GCC 4.1.2 可能违反了第 11 条。

11 大括号可以省略 初始化列表如下。如果 初始化列表以左开头 大括号,然后是成功的 初始化器的逗号分隔列表 初始化 a 的成员 子聚合;这是错误的 初始化器比 成员。然而,如果 子聚合的初始化列表 不以左大括号开头,则 列表中只有足够的初始化程序 被用来初始化成员 子集合;任何剩余的 初始化器被留下来初始化 聚合的下一个成员 当前子聚合是 会员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多