我正在尝试理解移动构造函数的实现。我们都知道,如果需要在C++类中管理资源,我们需要实现五个规则(C++编程)。
Microsoft给出了一个例子:https://msdn.microsoft.com/en-us/library/dd293665.aspx 这里有一个更好的例子,使用复制交换来避免代码重复:Dynamically allocating an array of objects
Microsoft给出了一个例子:https://msdn.microsoft.com/en-us/library/dd293665.aspx 这里有一个更好的例子,使用复制交换来避免代码重复:Dynamically allocating an array of objects
// C++11
A(A&& src) noexcept
: mSize(0)
, mArray(NULL)
{
// Can we write src.swap(*this);
// or (*this).swap(src);
(*this) = std::move(src); // Implements in terms of assignment
}
在移动构造函数中,直接:
// Can we write src.swap(*this);
// or (*this).swap(src);
我认为(*this) = std::move(src)
稍微有点复杂。因为如果我们不小心写成(*this) = src
,它会调用普通的赋值运算符而不是移动赋值运算符。
除了这个问题,在微软的示例中,他们编写了以下代码:在移动赋值运算符中,我们需要检查自我赋值吗?这种情况可能发生吗?
// Move assignment operator.
MemoryBlock& operator=(MemoryBlock&& other)
{
std::cout << "In operator=(MemoryBlock&&). length = "
<< other._length << "." << std::endl;
if (this != &other)
{
// Free the existing resource.
delete[] _data;
// Copy the data pointer and its length from the
// source object.
_data = other._data;
_length = other._length;
// Release the data pointer from the source object so that
// the destructor does not free the memory multiple times.
other._data = nullptr;
other._length = 0;
}
return *this;
}
src
设置为有效的移动状态?这应该最多需要4个赋值操作,如果您不关心更改移动对象的大小,则只需3个。 - NathanOliversrc.swap(*this);
或者(*this).swap(src);
。假定你已经实现了适合的swap
方法,我认为这样做是没有问题的。 - Igor Tandetnik