间接数组分配有效,而直接数组分配无效

Indirect array assignment works, while direct array assignment does not

本文关键字:分配 数组 无效 有效      更新时间:2023-10-16

两个数组赋值有什么区别,一个在结构内,一个在结构外?

struct A
{
   char s[4];
};
int main(int argc, char *argv[])
{
   char s[4];
   char d[4];
   d = s; // 'invalid array assignment'
   A a, b;
   b = a; // compiles without problems
   return 0;
}

默认运算符=应该调用逐个成员的赋值运算符。如果是这样,那么应该存在一个数组赋值运算符,但编译器不想显式调用它。为什么?

我认为这就是为什么...结构是一个类对象,有这个特殊的规则来分配成员它的数组,而不是数组本身(c++14 草稿):

12.8 复制和移动类对象

12.8.28. 非联合类 X 的隐式定义复制/移动赋值运算符执行成员复制- /move 其子对象的赋值。X 的直接基类首先按其顺序分配 在基本说明符列表中声明,然后分配 X 的直接非静态数据成员,在 它们在类定义中声明的顺序。设 x 为函数的参数之一 或者,对于移动运算符,指指参数的 x值。每个子对象都按以下方式分配 适合其类型:

  1. — 如果子对象是一个数组,则以适合元素类型的方式分配每个元素;

因此,复制过程不是为数组定义的(因为它是不可修改的变量类型),而是为数组的成员类型定义的。数组的隐式operator=没有定义。

数组

名称的值(例如,s)是数组的起始地址。在内存中分配数组后,该地址应固定。 d = s说的是将s[4]的起始地址分配给d[4],这显然是做不到的。

像您这样的简单结构只是一堆位。在您的情况下,A 的实例占用 4 个字节。当你做a = b时,它会将b的位复制到a位。

为了说明差异,我认为你不能做a.s = b.s.你可以试试。