间接数组分配有效,而直接数组分配无效
Indirect array assignment works, while direct array assignment does not
两个数组赋值有什么区别,一个在结构内,一个在结构外?
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;
}
默认运算符=
应该调用逐个成员的赋值运算符。如果是这样,那么应该存在一个数组赋值运算符,但编译器不想显式调用它。为什么?
我认为这就是为什么...结构是一个类对象,有这个特殊的规则来分配成员它的数组,而不是数组本身(c++14 草稿):
12.8 复制和移动类对象
12.8.28. 非联合类 X 的隐式定义复制/移动赋值运算符执行成员复制- /move 其子对象的赋值。X 的直接基类首先按其顺序分配 在基本说明符列表中声明,然后分配 X 的直接非静态数据成员,在 它们在类定义中声明的顺序。设 x 为函数的参数之一 或者,对于移动运算符,指指参数的 x值。每个子对象都按以下方式分配 适合其类型:
- — 如果子对象是一个数组,则以适合元素类型的方式分配每个元素;
因此,复制过程不是为数组定义的(因为它是不可修改的变量类型),而是为数组的成员类型定义的。数组的隐式operator=
没有定义。
数组
名称的值(例如,s
)是数组的起始地址。在内存中分配数组后,该地址应固定。 d = s
说的是将s[4]
的起始地址分配给d[4]
,这显然是做不到的。
像您这样的简单结构只是一堆位。在您的情况下,A
的实例占用 4 个字节。当你做a = b
时,它会将b
的位复制到a
位。
为了说明差异,我认为你不能做a.s = b.s
.你可以试试。
相关文章:
- 将数组的地址分配给变量并删除
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 获取字符串的长度并将其分配给数组
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 使用递归模板动态分配的多维数组
- 如何正确填充在堆上分配的二维数组?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 关于字符数组,我正在尝试将数组中的每个字符分配给另一个值
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 无法分配C++数组
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 分配 2D 可变大小的数组
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 动态分配字符数组的内存
- C++具有动态分配的字符数组的结构
- C 通过参考分配 /数组传递内存
- 使用字符串或字符动态分配(数组)