0

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

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

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

首先,我有一个 SqList 类和一个重载的 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;
}

有趣的是,如果我交换dataalterin的顺序SqListdata总是被初始化为{1,2,3,4,5}

如果您有兴趣,这是代码。

编译器探索

4

1 回答 1

1

如果我交换数据的顺序并改变SqListdata总是被初始化{1,2,3,4,5}

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

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

于 2020-03-27T23:44:36.030 回答