c ++默认赋值运算符

时间:2013-08-08 06:34:02

标签: c++ compiler-errors variable-assignment assignment-operator

int a[10];
int b[10];
a = b;

//

struct test {
    int a[10];
};

test a,b;
a = b;

第一个代码没有编译,因为我们不能分配数组,但第二个代码确实。类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二个代码会编译?

1 个答案:

答案 0 :(得分:4)

从C ++ 11草案,第12.8节:

  

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

     

- 如果子对象是类类型,就好像通过调用operator =将子对象作为对象表达式并将x的对应子对象作为单个函数参数(就像通过显式限定;即忽略任何在更多派生类中可能的虚拟覆盖函数);

     

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

     

- 如果子对象是标量类型,则使用内置赋值运算符。

这里重要的部分是:if the subobject is an array, each element is assigned, in the manner appropriate to the element type;