3

以下两个代码段介绍了将变量初始化ba. 第一个代码段使用复制初始化(使用 初始化=)初始化变量。假设类Apple被简单地定义为一个空类:class Apple {};

Apple a;
Apple b = a;

第二个代码段也使用复制初始化来初始化变量。虽然在初始化中复制的是a.

Apple a;
Apple b = Apple(a);

盲读时,似乎一个副本发生在Apple(a),另一个发生在Apple b = ...。相反,重写复制构造函数Apple以在复制上打印某些内容表明在Apple b = Apple(a).

这两个语句是否Apple b = a;相同Apple b = Apple(a);?是否存在它们不相同的情况?

4

1 回答 1

3

是的,在概念上Apple b = Apple(a);,一个临时的首先Apple是从构造的a,然后b是从临时的复制初始化的。由于复制省略,效果ba直接初始化的。

在以下情况下,编译器必须省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象直接构建到存储中,否则它们将被复制/移动到。复制/移动构造函数不需要存在或可访问:

  • 在对象的初始化中,当初始化表达式是与变量类型相同的类类型(忽略 cv-qualification)的纯右值时:

这种复制省略从 C++17 开始就得到保证,在 C++17 之前它是一种优化。使用 C++17 之前的模式和选项禁止优化进行编译,您可能会看到两种情况之间的差异。

居住

于 2020-12-08T06:55:06.753 回答