为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
POPMUISE 2019-08-19 14:27:41
为什么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。为什么结构支持成员方式的数组,但一般情况下不支持?
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

关于赋值运算符,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对象的赋值,左右操作数必须具有相同的类型,因此右操作数的值只是复制到左操作数中。


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 534 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信