struct A1
{
int n;
};
struct A2
{
int n;
A2(){}
};
struct A3
{
int n;
A3() = default;
};
问题1:
C ++标准是否保证类A1
,A2
,A3
完全相同?
问题2:
A1 a1;
A2 a2;
A3 a3;
编译器是否会按照C ++标准对a1.n
,a2.n
,a3.n
进行零初始化?
答案 0 :(得分:2)
A1
和A3
为aggregate type有一个区别,而A2
则不然,因为它有一个用户定义的构造函数。
类类型(通常是struct或union),具有
- ...
- 没有用户提供的
, inherited, or explicit (since C++17)
构造函数(explicitly defaulted or deleted constructors are allowed) (since C++11)
- ...
这意味着A1
和A3
可以对其进行汇总初始化,而A2
则可以。{/ p>
A1 a1{99}; // fine; n is initialized to 99
A3 a3{99}; // fine; n is initialized to 99
A2 a2{99}; // error; no matching constructor taking int found
编译器是否会按照C ++标准对
a1.n
,a2.n
,a3.n
进行零初始化?
根据default initialization的规则,如果它们具有自动存储持续时间,此处不进行零初始化,则所有值都将是不确定的。另一方面,静态和线程局部对象获得zero initialized。
答案 1 :(得分:2)
它们不相等,因为它们是不同的实体并具有不同的初始化:第一个和最后一个是聚合,第二个不是
聚合是一个数组或类(第9条),其中没有用户提供的构造函数(12.1),非静态数据成员(9.2)没有大括号或等于初始值,没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚函数(10.3)。
在此处详细了解:What are Aggregates and PODs and how/why are they special?
因此聚合初始化适用于A1
和A3
,它不适用于A2
struct A1
{
int n;
};
struct A2
{
int n;
A2(){}
};
struct A3
{
int n;
A3() = default;
};
int main()
{
A1 obj1{42};
//A2 obj2{42}; // error
A3 obj3{42};
return 0;
}
A1 a1; A2 a2; A3 a3;
编译器是否会按照C ++标准对a1.n,a2.n,a3.n进行零初始化
变量将为default initialized。