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的结构的整数数组进行零初始化?或者这是编译器错误?
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |