如果a具有包含标准构造函数和复制构造函数的类
class Ex{
//constructor definitions
}
以及将其作为参数(按值)的函数
void F(Ex _exin){...}
采取以下代码:
Ex A;
F(A); //F's parameter is copy constructed from A
F(Ex()); //F's parameter uses the default constructor
在第三行中,我使用默认构造函数向 F 传递 Ex 类的新(临时)对象。我的问题是:在创建这个新对象之后,它还是复制构造/分配(就像它发生在第二行)或是直接创建“内部” F ?
答案 0 :(得分:13)
很难找到,但说实话,这让我烦恼。这称为复制构造函数elision。
标准说明了这个例子:
class X{
public:
X(int);
X(const X&);
~X()
};
X f(X);
void g()
{
X a(1);
X b = f(X(2)); //identical to what you have:
a = f(a);
}
它说:
12.2 / 2临时物品
这里,实现可能使用临时构造 X(2)在使用X的copy-constructor传递给f()之前; 或者,X(2)可以构造在用于容纳的空间中 论点。 /.../
在此之后,该标准解释了返回值优化,这基本上是相同的。
所以它实际上与观察到的行为无关,它取决于编译器。
答案 1 :(得分:2)
它应该调用构造函数和复制构造函数
优化器可以删除不必要的复制