为什么在传递临时对象时不调用复制构造函数

时间:2016-04-18 16:57:52

标签: c++ c++11 copy-constructor

class MyClass
{
  public:    
  int a;
  MyClass(int r): a(r) {}

  MyClass(const MyClass& ref)
  {
      cout << "Copy Constructor\n";
      a= ref.a;
  }
};
int main()
{
    MyClass obj(5);
    MyClass obj1(MyClass(5));  //Case 1
    MyClass obj2(obj);        //Case 2
    return 0;
}

为什么在案例2中调用复制构造函数,而不是在案例1中调用。 在案例1中,临时对象作为参数传递。

1 个答案:

答案 0 :(得分:2)

MyClass obj1(MyClass(5));中,编译器省略了临时对象MyClass(5),因为它是允许的。

特别是,C ++标准2014§12.8第31段,定义了可以执行 copy elision 的案例:

  

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用......复制/移动操作的省略,称为复制省略,在以下情况下是允许的(其中   可以合并以消除多个副本):

     
      
  • 当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略副本/移动的目标。
  •