复制 C 风格的数组和结构

bet*_*eta 4 c++ arrays struct variable-assignment c++11

C++ 不允许使用=. 但是允许使用 复制结构=,如本链接中所示 -> Copying array in C v/s copying structure in C 。它还没有任何可靠的答案。但请考虑以下代码

#include <iostream>
using namespace std;

struct user {
    int a[4];
    char c;
};

int main() {
    user a{{1,2,3,4}, 'a'}, b{{4,5,6,7}, 'b'};
    a = b;             //should have given any error or warning but nothing
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码段没有给出任何错误和警告,而且工作正常。为什么?考虑解释两个问题(这个和上面链接的一个)。

Ted*_*gmo 9

您的类user获得一个隐式声明的复制构造函数隐式声明的复制赋值运算符

隐式声明的复制赋值运算符将内容从 复制ba

标准中的两段似乎适用:

类.copy.ctor

如果成员是数组,则每个元素直接用x的对应子对象初始化;

类.复制.分配

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


son*_*yao 5

是的,代码应该可以正常工作。数组不能作为一个整体直接赋值;但是它们可以通过隐式定义的复制赋值运算符分配为数据成员,对于非联合类类型,它执行非静态数据成员的成员方式复制赋值,包括数组成员及其元素。

数组类型的对象不能作为一个整体进行修改:即使它们是左值(例如可以获取数组的地址),它们也不能出现在赋值运算符的左侧:

int a[3] = {1, 2, 3}, b[3] = {4, 5, 6};
int (*p)[3] = &a; // okay: address of a can be taken
a = b;            // error: a is an array
struct { int c[3]; } s1, s2 = {3, 4, 5};
s1 = s2; // okay: implicity-defined copy assignment operator
         // can assign data members of array type
Run Code Online (Sandbox Code Playgroud)