我刚刚做了一些 move 语义练习,我似乎无法弄清楚为什么我的 move 赋值运算符没有被调用
我的课如下(请忽略与问题无关的任何不良做法):
private:
int sz;
double* elems;
public:
Vector(int size):sz(size), elems(new double[size])
{
for(int i=0; i!=sz; ++i)
{
elems[i] = i;
}
}
~Vector()
{
std::cout << "Destruct " << std::endl; delete [] elems;
}
double& operator[](int i)
{
return elems[i];
}
const double& operator[](int i)const
{
return elems[i];
}
//operator+ to add vectors
friend Vector operator+(const Vector& a, const Vector& b)
{
Vector ret(a.sz);
if(a.sz!=b.sz)
return 0;
std::cout << "Adding" << std::endl;
for(int i=0; i!=a.sz; ++i)
{
ret[i] = a[i] + b[i];
}
return ret;
}
//move constructor
Vector(Vector&& a): sz(a.sz),elems(a.elems)
{
std::cout << "Move constructor"<< std::endl;
a.elems = nullptr;
a.sz = 0;
}
//move assignment
Vector& operator=(Vector&& a)
{
std::cout << "Moveeee" << std::endl;
delete [] elems;
elems = a.elems;
sz = a.sz;
a.elems = nullptr;
a.sz = 0;
return *this;
}
现在我的测试用例如下:
Vector v1(3);
Vector v2(3);
Vector v3(3);
Vector v4 = v1+v2;
输出如下:
Adding
Move constructor
Destruct
Destruct
Destruct
Destruct
Destruct
我期望 Vector v4 = v1+v2;
行调用 move 赋值,但事实并非如此。相反,它会调用 move 构造函数。
我什至尝试了 Vector v4 = std::move(v2);
,但这也没有用并调用了 move 构造函数。
知道为什么没有调用 move 分配吗?
最佳答案
语义上你不是在调用赋值
Vector v4 = v1+v2;
真的是:
Vector v4(v1+v2);
如果没有复制构造函数,但存在默认构造函数和可接受的赋值,则将调用赋值。正如评论你需要做的那样:
Vector v4; v4 = v1 + v2;
有一个真正的任务
关于c++ - 未调用 move 赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21869210/