在数组上调用赋值运算符

时间:2015-12-28 10:22:47

标签: c++ arrays assignment-operator

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

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

那我的第一个代码怎么编译呢?

1 个答案:

答案 0 :(得分:6)

  

那我的第一个代码怎么编译呢?

语言规范说它必须工作,并且编译器实现了这种行为。

默认赋值语义在§12.8[class.copy] 的第28节中指定。具体而言,对象的数据成员是逐个分配的。对于数组,这个数组的元素是逐个分配的。

  

隐式定义的复制/移动赋值运算符   非联合类X 执行其成员复制/移动分配   子对象。 ...

  

- 如果子对象是一个数组,则 以适合于元素类型的方式为每个元素分配 ;

(强调我的)

请注意,在您的特定示例中,第一个代码示例调用未定义的行为,因为bar的元素在您从这里读取时未初始化:

foo = bar; // UB: bar.r uninitialized

您可以通过适当的初始化bar

来解决这个问题
my_array foo;
my_array bar{};