如果a具有包含标准和复制构造函数的类
class Ex{
//constructor definitions
}
Run Code Online (Sandbox Code Playgroud)
以及将其作为参数的函数(按值)
void F(Ex _exin){...}
Run Code Online (Sandbox Code Playgroud)
采取以下代码:
Ex A;
F(A); //F's parameter is copy constructed from A
F(Ex()); //F's parameter uses the default constructor
Run Code Online (Sandbox Code Playgroud)
在第三行中,我使用默认构造函数向F传递Ex类的新(临时)对象.我的问题是:在创建这个新对象后,它还复制构造/分配(就像它发生在第二行)或者它是直接创建"内部" F?
Luc*_*ore 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);
}
Run Code Online (Sandbox Code Playgroud)
它说:
12.2/2临时物体
这里,一个实现可能会使用一个临时构造X(2),然后使用X的copy-constructor将它传递给f(); 或者,X(2)可以在用于保存参数的空间中构造./.../
在此之后,该标准解释了返回值优化,这基本上是相同的.
所以它实际上与观察到的行为无关,它取决于编译器.