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

时间:2011-12-09 20:17:58

标签: c++ constructor

如果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

2 个答案:

答案 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)

它应该调用构造函数和复制构造函数

优化器可以删除不必要的复制