C++ 通过值作为参数传递临时对象-是否调用复制构造函数?

C++ 通过值作为参数传递临时对象-是否调用复制构造函数?,c++,constructor,C++,Constructor,如果一个类同时具有标准构造函数和复制构造函数 class Ex{ //constructor definitions } 以及将其作为参数(按值)的函数 以下面的代码为例: Ex A; F(A); //F's parameter is copy constructed from A F(Ex()); //F's parameter uses the default constructor 在第三行中,我使用默认构造函数将Ex类的一个新(临时)对象传递给F。我的问题是:创建

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

class Ex{
       //constructor definitions
}
以及将其作为参数(按值)的函数

以下面的代码为例:

Ex A;
F(A);   //F's parameter is copy constructed from A
F(Ex());  //F's parameter uses the default constructor

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

很难找到,但老实说,它一直困扰着我。这称为复制构造函数省略

本标准说明了此示例:

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)可以被构造在用于容纳容器的空间中 论点。//

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


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

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


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

我编辑了我的答案,您可能会发现它很有用。。使用调试器断点或构造函数内部的打印进行测试是很简单的。@KarlBielefeldt并非所有编译器都符合标准。在一个平台上的一个编译器中发生的事情并不构成规则。规则由标准制定。编译器可以选择打印或不打印。请阅读我的答案以了解更多信息。我同意,@Luchian。因此,我的建议是,确定它在您的环境中的行为的唯一方法是运行一个测试。@KarlBielefeldt,是的,但是如果假设它在所有环境中都是这样的话,那将是一个错误。这就是人们关心标准的原因。
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);
}