它们在隐式ctor,无参数空体ctor和显式默认ctor之间是否相等?

时间:2016-11-24 08:11:31

标签: c++ c++11 constructor standards semantics

struct A1
{
    int n;        
};

struct A2
{
    int n;
    A2(){}        
};

struct A3
{
    int n;
    A3() = default;        
};

问题1:

C ++标准是否保证类A1A2A3完全相同?

问题2:

A1 a1;
A2 a2;
A3 a3;

编译器是否会按照C ++标准对a1.na2.na3.n进行零初始化?

2 个答案:

答案 0 :(得分:2)

A1A3aggregate type有一个区别,而A2则不然,因为它有一个用户定义的构造函数。

  

类类型(通常是struct或union),具有

     
      
  • ...
  •   
  • 没有用户提供的, inherited, or explicit (since C++17)构造函数(explicitly defaulted or deleted constructors are allowed) (since C++11)
  •   
  • ...
  •   

这意味着A1A3可以对其进行汇总初始化,而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.na2.na3.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?

因此聚合初始化适用于A1A3,它不适用于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