我读到另一个问题 https://stackoverflow.com/a/5976829/440509在实现移动构造函数时,最好对初始化列表中的每个成员进行 std::move ,因为如果该成员恰好是另一个对象,则将调用该对象的移动构造函数。就像这样...
//Move constructor
Car::Car(Car && obj)
:
prBufferLength(std::move(obj.prBufferLength)),
prBuffer(std::move(obj.prBuffer))
{
obj.prBuffer = nullptr;
obj.prBufferLength = 0;
}
然而,在我见过的所有示例移动赋值运算符中,都没有提到出于同样的原因使用 std::move 。如果成员是一个对象,那么应该使用 std::move 吗?就像这样...
//Move assignment
Car Car::operator=(Car && obj)
{
delete[] prBuffer;
prBufferLength = std::move(obj.prBufferLength);
prBuffer = std::move(obj.prBuffer);
obj.prBuffer = nullptr;
obj.prBufferLength = 0;
return *this;
}
UPDATE:
我很欣赏在我选择的示例中不需要使用 std::move (很差),但是我对成员是否是对象感兴趣。
阅读链接的问题后,我可以看到第二个投票最多的答案中的建议是使用std::move
在移动构造函数的初始值设定项列表中,因为无论它是否是原始类型,它都会做正确的事情。我有点不同意这一点,并认为你应该只打电话std::move
在适当的情况下,但这取决于个人喜好。
另外,对于您的移动赋值运算符,您的方式很好,尽管我认为不必要的调用std::move
应该亲自删除。另一种选择是使用std::swap
这将为您做正确的事情。
Car Car::operator=(Car && obj)
{
std::swap(this->prBufferLength, obj.prBufferLength);
std::swap(this->prBuffer, obj.prBuffer);
return *this;
}
上面的移动赋值运算符和你的移动赋值运算符之间的区别在于内存的释放是delayed虽然您的版本会立即释放内存,但这在某些情况下可能很重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)