【问题标题】:Passing temporary object as parameter by value - is copy constructor called?按值传递临时对象作为参数 - 是否调用了复制构造函数?
【发布时间】:2012-01-17 01:59:49
【问题描述】:

如果一个类同时具有标准构造函数和复制构造函数

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

在第三行中,我使用默认构造函数将 Ex 类的新(临时)对象传递给 F。我的问题是:在创建这个新对象之后,它是否也复制构造/分配(就像它发生在第二行一样)还是直接在“内部”创建 F

【问题讨论】:

  • 我编辑了我的答案,您可能会发现它很有用。
  • Don't Be Afraid to Use The Science。使用调试器断点或构造函数内的打印进行测试是微不足道的。
  • @KarlBielefeldt 并非所有编译器都符合标准。在一个平台上的一个编译器中发生的事情并没有成为规则。规则由标准制定。编译器可以选择打印或不打印。阅读我的答案以获取更多信息。
  • 我同意,@Luchian。因此,我的建议是,确定它在 your 环境中的行为方式的唯一方法是运行测试。
  • @KarlBielefeldt,是的,但是假设它在所有环境中都是这样是错误的。这就是人们关心标准的原因。

标签: c++ constructor


【解决方案1】:

很难找到,但老实说,这让我很烦。这称为复制构造函数省略。

标准说明了这个例子:

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 的复制构造函数将其传递给 f() 之前; 或者,X(2) 可以在用于容纳 争论。 /.../

在这之后标准解释了返回值优化,这基本上是一样的。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2018-01-20
      • 2011-06-11
      相关资源
      最近更新 更多