int a[10];
int b[10];
a = b;
//
struct test {
int a[10];
};
test a,b;
a = b;
第一个代码无法编译,因为我们不能分配数组,但第二个代码可以。类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二个代码编译?
int a[10];
int b[10];
a = b;
//
struct test {
int a[10];
};
test a,b;
a = b;
第一个代码无法编译,因为我们不能分配数组,但第二个代码可以。类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二个代码编译?
来自 C++11 草案,第 12.8 节:
非联合类 X 的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动赋值。X 的直接基类首先按照它们在 base-specifier-list 中的声明顺序分配,然后按照它们在类定义中声明的顺序分配 X 的直接非静态数据成员. 令 x 为函数的参数,或者对于移动运算符,为引用参数的 xvalue。每个子对象都以适合其类型的方式分配:
— 如果子对象是类类型,就好像通过调用 operator= 将子对象作为对象表达式和 x 的相应子对象作为单个函数参数一样(好像通过显式限定;也就是说,忽略任何可能的虚拟覆盖更多派生类中的函数);
— 如果子对象是一个数组,则以适合元素类型的方式分配每个元素;
— 如果子对象是标量类型,则使用内置赋值运算符。
这里的重要部分是:if the subobject is an array, each element is assigned, in the manner appropriate to the element type;