我想知道这段代码是如何工作的:
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;
}
那我的第一个代码怎么编译呢?
答案 0 :(得分:6)
那我的第一个代码怎么编译呢?
语言规范说它必须工作,并且编译器实现了这种行为。
默认赋值语义在§12.8[class.copy] 的第28节中指定。具体而言,对象的数据成员是逐个分配的。对于数组,这个数组的元素是逐个分配的。
隐式定义的复制/移动赋值运算符 非联合类X 执行其成员复制/移动分配 子对象。 ...
和
- 如果子对象是一个数组,则 以适合于元素类型的方式为每个元素分配 ;
(强调我的)
请注意,在您的特定示例中,第一个代码示例调用未定义的行为,因为bar
的元素在您从这里读取时未初始化:
foo = bar; // UB: bar.r uninitialized
您可以通过适当的初始化bar
:
my_array foo;
my_array bar{};