正在数组上调用赋值运算符

Calling assignment operator on an array

本文关键字:调用 赋值运算符 数组      更新时间:2023-10-16

我想知道这个代码是如何工作的:

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{};