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;
}
有趣的是,如果我交换 SqList
中 data
和 alter
的顺序,data
总是用 {1,2,3,4,5}
初始化
Here 是代码,如果你有兴趣。
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
并且输出 (更不用说两个版本的警告了。
当改变数据数组的顺序时,似乎 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;
}
有趣的是,如果我交换 SqList
中 data
和 alter
的顺序,data
总是用 {1,2,3,4,5}
初始化
Here 是代码,如果你有兴趣。
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
并且输出 (更不用说两个版本的警告了。