当前位置:  开发笔记 > 编程语言 > 正文

在数组上调用赋值运算符

如何解决《在数组上调用赋值运算符》经验,为你挑选了1个好方法。

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

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> juanchopanza..:

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

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

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

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

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

(强调我的)


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

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

您可以通过适当的初始化来解决此问题bar:

my_array foo;
my_array bar{};

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有