【问题标题】:C++11 class member initializationC++11 类成员初始化
【发布时间】:2017-09-03 10:41:26
【问题描述】:

刚刚从 C++03 切换到 C++11,我想知道,以下是否定义为始终为零初始化所有元素的数组 data?

template<size_t COUNT>
class Test {
public:
    uint32 data[COUNT] = {};
};

【问题讨论】:

  • 附带说明,如果您刚刚升级到 C++11,那么您不妨已经升级到 C++14。
  • 是的,但是如果您切换到 C++11,您还应该使用 ::std::array 而不是普通的 C 数组,并且不需要在两者之间放置 =,除非您需要避免意外调用到显式构造函数。
  • @tambre - 哦,实际上,我一定是出于习惯提到了 C++11(我已经在 03 中停留了好几年了,啊哈)
  • 有趣的是,您可以对数组进行直接初始化而不是复制初始化:uint32 data[COUNT] {};
  • @AnneQuinn 我相信uint32 data[COUNT] = {}; 在 C++03 中也会对数组进行零初始化,请参阅 this,尽管 C++03 不允许类内成员初始化。跨度>

标签: c++ c++11 initialization list-initialization zero-initialization


【解决方案1】:

是的,这是有保证的; list initialization 转为 aggregate initialization 用于数组类型:

否则,如果T是聚合类型,则执行聚合初始化。

然后进行聚合初始化:

如果初始化子句的数量小于成员的数量或初始化列表完全为空,则剩余成员由空列表初始化,按照通常的列表初始化规则(对非类类型和具有默认构造函数的非聚合类,以及聚合的聚合初始化)。

所以data 的所有元素都将是value initialized,对于uint32,它们最终将是zero-initialized。

否则,对象被零初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多