【发布时间】:2017-12-05 22:00:50
【问题描述】:
CPP Refs 指出:
——当一个未绑定到引用(12.2)的临时类对象将被复制/移动到具有相同cv-unqualified类型的类对象时,可以通过构造临时对象来省略复制/移动操作直接进入省略复制/移动的目标
假设我有一些测试代码:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class MyVector : public vector<T>
{
public:
MyVector()
{
cout << "MyVector()" << endl;
}
MyVector(const MyVector& right):
vector<T>(right)
{
cout << "MyVector(const MV&)" << endl;
}
MyVector(MyVector&& right) :
vector<T>(right)
{
cout << "MyVector(MV&&)" << endl;
}
};
class A
{
public:
A() = default;
A(MyVector<char> vec) :
_vec(std::move(vec))
{
cout << "A(MyVec)" << endl;
}
private:
MyVector<char> _vec;
};
MyVector<char> funcElision()
{
cout << "\nElision" << endl;
MyVector<char> tmp;
tmp.emplace_back('a');
return tmp;
}
A funcElisionExternal()
{
cout << "\nElision external test" << endl;
return A(funcElision());
}
A funcElisionInternal()
{
cout << "Elision internal test" << endl;
MyVector<char> tmp;
tmp.emplace_back('a');
return A(tmp);
}
int main()
{
auto a = funcElisionInternal();
auto b = funcElisionExternal();
}
测试的输出是:
Elision internal test
MyVector()
MyVector(const MV&)
MyVector(MV&&)
A(MyVec)
Elision external test
Elision
MyVector()
MyVector(MV&&)
A(MyVec)
End
函数 elisionExternal 确实按预期工作,但我不知道为什么 elisionInternal 正在执行复制操作,因为 MyVec 是临时对象?
【问题讨论】:
-
临时
A对象是用tmp的副本构造的,因为那是您编写的代码。具体是哪一部分不清楚? -
tmp不是临时对象。
标签: c++ c++17 copy-elision