在临时对象上复制构造函数c ++

Jae*_*bum 5 c++ constructor copy-constructor

#include <iostream>
using namespace std;

class A
{
    int x;

public:
    A(int c) : x(c) {}
    A(const A& a) { x = a.x; cout << "copy constructor called" << endl;}
};

class B
{
    A a;

public:
    B(int c) : a(c) {}
    B(const B& b) : a(b.a) { }
    A get_A() { return a;}
};

int main()
{
    B b(10);
    A a1 = b.get_A();

}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我预计'复制构造函数调用'消息会弹出两次,因为首先,b.get_A()将创建一个临时对象,它调用复制构造函数(1),其次,它会将其引用复制到a1' s复制构造函数(2),从而显示两条消息.

但是,代码实际上会产生一个名为'复制构造函数'的消息.为什么?

Ste*_*eve 8

C++标准允许在某些情况下省略复制构造函数.通常,这意味着是否将从临时变量复制构造对象.它可以在适当的位置构建.

在这种情况下get_A();已经将副本返回到临时副本中.然后分配a1给该临时变量.允许编译器忽略额外的副本并a1使用返回值来构造get_A().

即使复制构造函数具有副作用,也可能发生此优化.

复制省略是唯一允许改变可观察副作用的优化形式.因为某些编译器在允许的每种情况下都不执行复制省略,所以依赖于复制/移动构造函数和析构函数的副作用的程序是不可移植的.