C++中的聚合初始化安全性

Gre*_*reg 8 c++ ada aggregate-initialization

假设我有以下结构:

struct sampleData
{
       int x;
       int y;
};
Run Code Online (Sandbox Code Playgroud)

在使用时,我想将sampleData类型的变量初始化为已知状态.

sampleData sample = { 1, 2 } 
Run Code Online (Sandbox Code Playgroud)

后来,我决定我需要在我的sampleDatastruct中存储更多数据,如下所示:

struct sampleData
{
       int x;
       int y;
       int z;
};
Run Code Online (Sandbox Code Playgroud)

我的理解是,从我的预z数据结构遗留下来的两个字段初始化仍然是一个有效的语句,并将被编译.使用默认值填充缺少的字段.

这种理解是否正确?我最近一直在Ada工作,它也允许聚合初始化,但是它会将类似的问题标记为编译错误.假设我对上面的C++代码的假设是正确的,是否有一种语言结构可以将缺少的初始化值识别为错误?

Pet*_*der 5

只有Aggregate Classes支持以这种方式初始化变量.

如果添加的构造函数(或多个),然后然后问题消失,但你需要改变语法一点,你失去了存储能力structunion(除其他事项外).

struct sampleData
{
    sampleData(int x, int y) : x(x), y(y) {}
    int x;
    int y;
};

sampleData sample( 1, 2 );
Run Code Online (Sandbox Code Playgroud)

添加z(和更改构造函数)将标记sample( 1, 2 )为编译错误.

  • 不,只有聚合类才支持初始化变量.所有聚合类都是POD类型,但并非所有POD类型都是聚合类,因此并非所有POD类型都支持聚合初始化. (2认同)