C++按值返回

Abr*_*ile 2 c++ function copy-constructor

从下面的代码我期望CA类可以调用以下代码

  1. 构造函数创建函数返回的临时对象 foo
  2. 复制构造函数以创建要传递给amain中变量的变量
  3. 另一个复制构造函数,它将a根据函数返回的值创建变量.

为什么不是这样?我的结果就是

A
Run Code Online (Sandbox Code Playgroud)

虽然我在期待

ABB
Run Code Online (Sandbox Code Playgroud)

所以只调用构造函数.编译器是在幕后优化还是我错过了一些C++概念?

class CA{
public:
   CA(){ std::cout << "A"; }
   CA( const CA& ){ std::cout << "B"; }
   CA& operator=(const CA& ){ std::cout << "C";return *this; }
};

CA foo(){
      return CA();
}

int main(){
 CA a = foo();    
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 8

编译器是在幕后优化还是我错过了一些C++概念?

发现!它被称为复制省略.在谷歌上查找RVO和NRVO.你也应该查看三个规则.

复制省略是允许编译器执行的唯一影响可观察行为的优化.出于这个原因,您不应该在复制构造函数中放置重要的逻辑.