struct Data d = {0}和struct Data d = {}之间有什么区别吗

vik*_*kas 7 c++ struct initialization aggregate-initialization

我的代码中有两种类型的结构变量初始化.

#include<iostream>
#include<string>
using namespace std;
struct Data{
   int arr[5];
   float x;

};
int main(){
   struct Data d = {0};
   struct Data d1 = {};
   cout<<d.arr[0]<<d.x;
   cout<<d1.arr[0]<<d1.x<<endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在运行代码广告获取0 0 0 0作为我的输出.请帮帮我,两者初始化有什么区别.

son*_*yao 7

根据聚合初始化的规则,这里的效果是相同的,即结构的所有成员都将被初始化(对于非类类型,这里零初始化).

如果初始化条款的数目小于成员的数量and bases (since C++17)或初始化列表完全是空的,其余成员and bases (since C++17)都被初始化by their default initializers, if provided in the class definition, and otherwise (since C++14)由空列表,按照通常的列表初始化规则(其执行值初始化用于非类类型和具有默认构造函数的非聚合类,以及聚合的聚合初始化).如果引用类型的成员是其余成员之一,则该程序格式错误.

更确切地说,

struct Data d = {0}; // initialize the 1st member of Data to 0, value-initialize(zero-initialize) the remaining members
struct Data d1 = {}; // value-initialize(zero-initialize) all the members of Data
Run Code Online (Sandbox Code Playgroud)

需要注意的是整个故事是基于Data是一个聚合类型,其成员都是非类类型,否则行为将根据规则更改列表初始化.