将临时对象作为参数传递 - 是复制构造函数吗?

Mal*_*rba 8 c++ constructor

如果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)可以在用于保存参数的空间中构造./.../

在此之后,该标准解释了返回值优化,这基本上是相同的.

所以它实际上与观察到的行为无关,它取决于编译器.