[英]copy constructor c++ on temporary objects
#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();
}
在上面的代码中,我预计'复制构造函数调用'消息会弹出两次,因为首先,b.get_A()将创建一个临时对象,它调用复制构造函数(1),其次,它会将其引用复制到a1' s复制构造函数(2),从而显示两条消息。
但是,代码实际上会产生一个名为'复制构造函数'的消息。 为什么?
C ++标准允许在某些情况下省略复制构造函数 。 通常,这意味着是否将从临时变量复制构造对象。 它可以在适当的位置构建。
在这种情况下get_A();
已经归还了一份临时副本。 然后,您将a1
分配给该临时变量。 允许编译器删除额外的副本并使用get_A()
的返回值构造a1
。
即使复制构造函数具有副作用,也可能发生此优化。
复制省略是唯一允许改变可观察副作用的优化形式。 因为某些编译器不允许在允许的每种情况下执行复制省略,所以依赖于复制/移动构造函数和析构函数的副作用的程序是不可移植的。
在C ++ 11中,代码可能会调用移动构造函数来移动对象而不是复制它,或者在C ++ 03和C ++ 11中,NRVO形式的编译器优化可能会应用复制省略来删除副本。
请注意,后者( 复制省略 )取决于编译器的功能,并且无法保证在C ++ 11中保证前者( 移动语义 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.