两个数组赋值之间有什么区别,一个在结构内部,一个在结构外部?
struct A
{
char s[4];
};
int main(int argc, char *argv[])
{
char s[4];
char d[4];
d = s; // 'invalid array assignment'
A a, b;
b = a; // compiles without problems
return 0;
}
默认运算符=
应该调用逐个成员的赋值运算符。如果是这样,那么应该存在一个数组赋值运算符,但编译器不希望显式调用它。为什么呢?
答案 0 :(得分:1)
我认为这就是为什么...... Struct是一个类对象,有一个特殊的规则,用于为成员分配一个数组,而不是数组本身(c++14 draft):
12.8复制和移动类对象
28年8月12日。非联合类X的隐式定义的复制/移动赋值运算符执行成员复制 - /移动其子对象的分配。首先按照它们的顺序分配X的直接基类 base-specifier-list中的声明,然后分配X的直接非静态数据成员 它们在类定义中声明的顺序。设x是函数的参数 或者,对于移动运算符,引用参数的xvalue。每个子对象都以这种方式分配 适合其类型:
- - 如果子对象是一个数组,则以适合于元素类型的方式分配每个元素;
醇>
因此没有为数组定义复制过程(因为它是一个不可修改的变量类型),但是对于作为数组的成员类型。对于数组,没有隐式operator=
的定义。
答案 1 :(得分:-2)
数组名称的值(例如,s
)是数组的起始地址。一旦数组在内存中分配,该地址应该是固定的。 d = s
说要将s[4]
的起始地址分配给d[4]
,这显然无法完成。
像你这样的简单结构只是一点点。在您的情况下,A
的实例占用4个字节。当您执行a = b
时,会将b
的位复制到a
的位。
为了说明不同之处,我认为你不能做a.s = b.s
。你可以试试。