C++默认赋值运算符

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

//

struct test {
    int a[10];
};

test a,b;
a = b;

第一段代码无法编译,因为我们无法分配数组,但第二个可以。类的默认赋值操作符难道不只是为每个数据成员调用赋值吗?为什么第二段代码可以编译通过?


默认的类赋值运算符将复制数组的所有元素。这就是std::array在没有用户提供的情况下工作的方式。 - chris
1
因为针对作为成员的数组做了特殊的例外处理。 - Benjamin Lindley
为什么要使用std::array?我有什么遗漏的吗? - user2656151
1个回答

4
根据C++11草案第12.8节,非联合类X的隐式定义复制/移动赋值运算符执行其子对象的逐个复制/移动赋值操作。 X的直接基类按其在基础说明符列表中的声明顺序首先被分配,然后按照它们在类定义中声明的顺序依次分配X的直接非静态数据成员。让x是函数的参数或者是移动运算符的xvalue引用参数。每个子对象都以适当的方式进行分配: - 如果子对象是类类型,则像调用operator=一样使用子对象作为对象表达式,并将x的相应子对象作为单个函数参数(就像通过显式限定符一样;也就是忽略任何可能存在于更派生类中的虚拟重载函数)。 - 如果子对象是数组, 使用适当于元素类型的方式,对每个元素进行赋值。 - 如果子对象是标量类型,则使用内置的赋值运算符。
这里的重要部分是:如果子对象是数组,则使用适当于元素类型的方式对每个元素进行赋值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接