我想知道这段代码是如何工作的:
struct my_array { int r[1000]; }; int main() { my_array foo, bar; foo = bar; }
因为foo = bar
调用将调用operator=
为类提供的构造函数,它将懒惰地将它应用于每个成员.但是数组没有实现operator=
,证明是,这段代码无法编译:
int main() { int a[1000], b[1000]; a = b; }
那我的第一个代码怎么编译呢?
那我的第一个代码怎么编译呢?
语言规范说它必须工作,编译器实现了这种行为.
默认赋值语义在第12.8节[class.copy]的第28 节中指定.具体而言,对象的数据成员是逐个分配的.对于数组,这个数组的元素是逐个分配的.
非联合类X的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动分配....
和
- 如果子对象是一个数组,则以适合于元素类型的方式分配每个元素 ;
(强调我的)
请注意,在您的特定示例中,第一个代码示例调用未定义的行为,因为在bar
您从这里读取它们时,这些元素是未初始化的:
foo = bar; // UB: bar.r uninitialized
您可以通过适当的初始化来解决此问题bar
:
my_array foo; my_array bar{};