C++ 聚合初始化行为与数据数组

C++ aggregate initialiser behaviour with data array

当改变数据数组的顺序时,似乎 data 总是被聚合初始化器初始化的那个(而不是 alter)。为什么?

struct SqList
{
   ElemType alter[MAXSIZE];
   ElemType data[MAXSIZE];//swap order here
   int Length;
};

编译器不是应该将第一个有效内存块作为初始化目标吗?

首先,我有一个 SqList class 和一个重载的 operator<< 来打印内容。

struct SqList
{
    ElemType data[MAXSIZE];
    ElemType alter[MAXSIZE];
    int Length;
};

ostream& operator<<(ostream& os,const SqList& sql)
{
    for(auto i:sql.data)
        os<<i<<" ";
    os<<"\n";

     for(auto i:sql.alter)
        os<<i<<" ";
    os<<"\n";
    return os;
}

在main()中,SqList的实例是用聚合初始化器创建的

int main()
{
    SqList s{1,2,3,4,5};
    cout<<s;
}

有趣的是,如果我交换 SqListdataalter 的顺序,data 总是用 {1,2,3,4,5} 初始化

Here 是代码,如果你有兴趣。

compiler explore

if I swap the order of data and alter in SqList, data always got initialized with {1,2,3,4,5}

不,这不是观察到的行为。参见例如这两个版本:https://godbolt.org/z/VTeheX vs https://godbolt.org/z/bkA8zs

当您交换 class 声明中的行时,在 operator<< 的重载定义中,您的代码总是在 alter 之前打印 data 并且输出 (更不用说两个版本的警告了。