复制构造函数未在模板类中调用

时间:2016-01-08 12:01:00

标签: c++ templates copy-constructor

#include <iostream>
using namespace std;

template <typename T> class tt
{
    public :
    int data;
    tt()
    {
        std::cout << std::endl << "   CONSTRUCTOR" << std::endl;
    }
    tt(const tt & that)
    {
        std::cout << std::endl << "    COPY CONSTRUCTOR" << std::endl;
    }
};


tt<int> test(void)
{
    std::cout << std::endl << "      INSIDE " << std::endl; tt<int> a; a.data =10 ;return a;
}

int main() {
    // your code goes her
    //tt<int> b;
    tt<int> a =test();
    cout<<a.data; //so that return value optimisation doesn't take place
    return 0;
}

为什么在这种情况下不会调用复制构造函数?

虽然

在以下情况下被调用
tt<int> b;
tt<int> a =b;

代码链接:http://ideone.com/e9lq3C

编辑:这不是What are copy elision and return value optimization?的重复,因为在代码中引用了返回的值。

2 个答案:

答案 0 :(得分:2)

a与临时地点的位置不同。这就是复制省略和返回值优化所做的......他们这样做是为了让你不会得到一个临时的。如果您在a中说test(),则优化意味着您在a中指的是与main相同的位置。所以不需要复制。

答案 1 :(得分:1)

这完全归功于编译器优化(至少RVO)。编译器最终创建了一个且只有一个对象(您要求在test()中本地创建的对象与您的a变量成为同一个对象。)