猿问

为什么C和C ++支持在结构中成员分配数组,但一般不支持?

为什么C和C ++支持在结构中成员分配数组,但一般不支持?

我理解不支持成员分配数组,因此以下方法不起作用:


int num1[3] = {1,2,3};

int num2[3];

num2 = num1; // "error: invalid array assignment"

我只是接受了这个事实,认为该语言的目的是提供一个开放式框架,并让用户决定如何实现诸如复制数组之类的东西。


但是,以下工作正常:


struct myStruct { int num[3]; };

struct myStruct struct1 = {{1,2,3}};

struct myStruct struct2;

struct2 = struct1;

该数组num[3]是从其实例中成员分配struct1到其实例中的struct2。


为什么结构支持成员方式的数组,但一般情况下不支持?




POPMUISE
浏览 535回答 3
3回答

慕的地10843

关于赋值运算符,C ++标准如下(C ++03§5.17/ 1):有几个赋值运算符... 都需要一个可修改的左值作为它们的左操作数数组不是可修改的左值。但是,特别定义了对类类型对象的赋值(§5.17/ 4):对类的对象的赋值由复制赋值运算符定义。因此,我们期待看一个类的隐式声明的复制赋值运算符(§12.8/ 13):类X的隐式定义的复制赋值运算符执行其子对象的成员分配。...每个子对象都以适合其类型的方式分配:... - 如果子对象是一个数组,则以适合于元素类型的方式分配每个元素...因此,对于类类型对象,可以正确复制数组。请注意,如果您提供用户声明的复制赋值运算符,则无法利用此操作,并且您必须逐个元素地复制数组。推理在C(C99§6.5.16/ 2)中类似:赋值运算符应具有可修改的左值作为其左操作数。并且§6.3.2.1/ 1:一个可修改的左值是一个没有数组类型的左值... [其他约束如下]在C中,赋值比C ++(§6.5.16.1/ 2)简单得多:在简单赋值(=)中,右操作数的值将转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。对于struct-type对象的赋值,左右操作数必须具有相同的类型,因此右操作数的值只是复制到左操作数中。
随时随地看视频慕课网APP
我要回答