无法调用复制构造函数

时间:2016-03-16 04:47:02

标签: c++

我确信,我在这里错过了一件简单的事情,

我无法在代码中调用复制构造函数。 可能是什么原因?

编译器是否优化了我的代码?

#include<iostream>
using namespace std;

class Test
{
public:
int x;
Test(){ 
    x=100;
    cout << "Test() Called\n";
    }
Test(const Test &t) {   
    this->x=t.x;
    cout << "Test-Copy() Called\n";
    }

    };

Test fun()
{
    cout << "fun() Called\n";
    Test t;
    return t;
}

int main()
{
   Test t1;
   Test t2 = fun();
   cout<<t2.x<<endl;
   return 0;
}

1 个答案:

答案 0 :(得分:4)

编译器可能省略类对象的复制和移动构造函数,即使复制/移动构造函数和析构函数具有可观察的副作用。这称为复制椭圆。

其中一个condition是:

  

如果函数按值返回类类型,则返回   statement的表达式是一个非易失性对象的名称   自动存储持续时间,不是函数参数,或者是   catch子句参数,它具有相同的类型(忽略   顶级cv-qualification)作为函数的返回类型,然后   复制/移动被省略。当构造该本地对象时,它就是   直接在存储中构造函数的返回值   否则将被移动或复制到。复制省略的这种变体是   被称为NRVO,“命名返回值优化”。

如果要强制调用复制构造函数,请显式中断上面定义的条件之一。