【问题标题】:Copy constructor on return in C++ [duplicate]在 C++ 中返回时复制构造函数 [重复]
【发布时间】:2021-03-23 23:09:29
【问题描述】:

我正在尝试理解以下内容

#include <iostream>

class Number {
  int _value;
public:
  Number(int number) : _value(number) { std::cout<<"constructed!\n"; }
  Number(const Number& other) : _value(other._value) { std::cout<<"copied!\n"; }
  ~Number() { std::cout<<"destructed!\n"; }
};

Number create_number(int value) {
  Number out(value);
  return out;
}

int main() {
  Number my_number = create_number(10);
}

输出是

constructed!
destructed!

我本来希望在 create_number 内部构造一个对象,复制到函数的输出,然后在函数返回后销毁。

似乎会发生这样的事情,因为如果我明确复制构造函数

explicit Number(const Number& other) : _value(other._value) { std::cout<<"copied!\n"; }

编译器用no matching constructor for initialization of 'Number'return out 大喊大叫。如果我在create_number 中显式调用复制构造函数,甚至将数字out 转换为数字(嗯?)

return Number(out);
return (Number)out;

编译器很高兴,我得到了预期的输出

constructed!
copied!
destructed!
destructed!

我觉得我缺少关于 return、复制构造函数和/或(隐式)转换的一些内容。有人可以解释一下吗?

【问题讨论】:

  • 查找“NRVO”。

标签: c++ constructor casting return copy-constructor


【解决方案1】:

那是copy elision。在不深入了解 C++ 标准晦涩难懂的语言的情况下,在大多数情况下,编译器可能删除(优化掉)副本,但这不是必需的。这被视为任何其他优化。

有趣的是,这是 as-if rule 的一个罕见例外,优化的副作用是可以观察到的 - 请参阅这些链接中的注释。

【讨论】:

  • 谢谢!我想现在是时候阅读一些我过去一直在回避的话题了。
猜你喜欢
  • 2019-08-12
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2018-10-17
  • 1970-01-01
相关资源
最近更新 更多