#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;
编辑:这不是What are copy elision and return value optimization?的重复,因为在代码中引用了返回的值。
答案 0 :(得分:2)
a
与临时地点的位置不同。这就是复制省略和返回值优化所做的......他们这样做是为了让你不会得到一个临时的。如果您在a
中说test()
,则优化意味着您在a
中指的是与main
相同的位置。所以不需要复制。
答案 1 :(得分:1)
这完全归功于编译器优化(至少RVO)。编译器最终创建了一个且只有一个对象(您要求在test()
中本地创建的对象与您的a
变量成为同一个对象。)