间接数组赋值有效,而直接数组赋值则无效

时间:2015-01-22 15:00:22

标签: c++ arrays variable-assignment

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

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;
}

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

2 个答案:

答案 0 :(得分:1)

我认为这就是为什么...... Struct是一个类对象,有一个特殊的规则,用于为成员分配一个数组,而不是数组本身(c++14 draft):

  

12.8复制和移动类对象

     

28年8月12日。非联合类X的隐式定义的复制/移动赋值运算符执行成员复制 -   /移动其子对象的分配。首先按照它们的顺序分配X的直接基类   base-specifier-list中的声明,然后分配X的直接非静态数据成员   它们在类定义中声明的顺序。设x是函数的参数   或者,对于移动运算符,引用参数的xvalue。每个子对象都以这种方式分配   适合其类型:

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

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

答案 1 :(得分:-2)

数组名称的值(例如,s)是数组的起始地址。一旦数组在内存中分配,该地址应该是固定的。 d = s说要将s[4]的起始地址分配给d[4],这显然无法完成。

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

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