c ++数组零初始化:这是一个错误,还是这个正确?

pae*_*bal 14 c++ standards-compliance compiler-bug c++98

注意:我们在这里谈论(据称)符合C++ 98的编译器.这不是C++ 11的问题.

我们在其中一个编译器中有一个奇怪的行为,我们不确定这是否正常或者这是否是编译器错误:

// This struct has a default constructor
struct AAA
{
   AAA() : value(0) {}
   int value ;
} ;

// This struct has a member of type AAA and an array of int, both surrounded
// by ints
struct BBB
{
   int m_a ;
   AAA m_b ;
   int m_c ;
   int m_d[42] ;
} ;
Run Code Online (Sandbox Code Playgroud)

当BBB初始化时:

BBB bbb = {0} ;
Run Code Online (Sandbox Code Playgroud)

我们期望BBB的所有POD成员(包括m_d,整数数组)被零初始化,并且要构建BBB的所有非POD成员.

这适用于AIX的本机编译器,在Linux/GCC-3.4上,在Windows/VisualC++上......但不适用于Solaris/SunStudio,其中只有非数组成员被零初始化.

我们在C++ 98标准(草案文档)中进行了一些研究,在那里我们发现了以下内容:

[12.6.1 - 2]

当聚合(无论是类还是数组)包含类类型的成员并由大括号括起的初始化列表(8.5.1)初始化时,每个这样的成员都由相应的赋值表达式进行复制初始化(见8.5).如果初始化列表中的初始值设定项少于聚合的成员,则未明确初始化的每个成员都应默认初始化(8.5).

然后:

[8.5 - 5]

T类型的对象进行零初始化存储意味着:
- 如果T是标量类型(3.9),则将存储设置为0(零)转换为T的值;
- 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象的存储都是零初始化的;
- 如果T是联合类型,则其第一数据成员89)的存储是零初始化的;
- 如果T是数组类型,则每个元素的存储都是零初始化的;
- 如果T是引用类型,则不执行初始化.

然后:

默认初始化 T类型的对象意味着:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象的存储被零初始化.

我读它的方式:SunStudio应该初始化整数数组(BBB :: m_d)

奇怪的是:如果我们从AAA中删除默认构造函数,那么BBB中的所有内容都是零初始化的.

问题:SunStudio行为标准是否无法对包含非POD的结构的整数数组进行零初始化?或者这是编译器错误?

Yon*_*Nir 2

这确实是 Sun/Solaris 的一个错误。您所写的确实是应该发生的事情,并且您所写的一切都是正确的。