c++ 默认赋值运算符
Posted
技术标签:
【中文标题】c++ 默认赋值运算符【英文标题】:c++ default assignment operator 【发布时间】:2013-08-09 18:31:58 【问题描述】:int a[10];
int b[10];
a = b;
//
struct test
int a[10];
;
test a,b;
a = b;
第一个代码无法编译,因为我们不能分配数组,但第二个代码可以。类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二段代码会编译?
【问题讨论】:
默认的类赋值运算符将复制数组的所有元素。这就是std::array
在没有用户提供的情况下的工作方式。
因为作为成员的数组有一个特殊的例外。
为什么涉及std::array?我错过了什么吗?
【参考方案1】:
来自 C++11 草案,第 12.8 节:
非联合类 X 的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动赋值。首先分配 X 的直接基类,按照它们在基说明符列表中的声明顺序,然后按照它们在类定义中声明的顺序分配 X 的直接非静态数据成员.令 x 为函数的参数,或者对于移动运算符,为引用参数的 xvalue。每个子对象都以适合其类型的方式分配:
——如果子对象是类类型,就好像通过调用 operator= 将子对象作为对象表达式和 x 的相应子对象作为单个函数参数一样(好像通过显式限定;也就是说,忽略任何更多派生类中可能的虚拟覆盖函数);
——如果子对象是一个数组,则以适合元素类型的方式分配每个元素;
——如果子对象是标量类型,则使用内置赋值运算符。
这里重要的部分是:if the subobject is an array, each element is assigned, in the manner appropriate to the element type;
【讨论】:
以上是关于c++ 默认赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章