我認爲下面的代碼比copy-and-swap idiom更好。可以安全地使用複製/移動ctors來實現複製/移動賦值操作符嗎?
通過這種方式,你可以用兩個宏來封裝副本的定義和移動賦值運算符。換句話說,您可以避免在代碼中明確定義它們。因此,您只能將注意力集中在ctors和dtor上。
是否有方法的任何不利?
class A
{
public:
A() noexcept
: _buf(new char[128])
{}
~A() noexcept
{
if (_buf)
{
delete[] _buf;
_buf = nullptr;
}
}
A(const A& other) noexcept
: A()
{
for (int i = 0; i < 128; ++i)
{
_buf[i] = other._buf[i];
}
}
A(A&& other) noexcept
: _buf(other._buf)
{
_buf = nullptr;
}
A& operator =(const A& other) noexcept
{
if (this != &other)
{
this->~A();
new(this) A(other);
}
return *this;
}
A& operator =(A&& other) noexcept
{
if (this != &other)
{
this->~A();
new(this) A(static_cast<A&&>(other));
}
return *this;
}
private:
char* _buf;
};
你的默認構造函數'noexcept'究竟如何?而你的移動構造函數不會移動任何東西。在刪除某物之前,不需要檢查'nullptr'。爲什麼'static_cast '而不是'std :: move'? – Praetorian
_buf(other._buf)等._buf = nullptr;只是移動操作。 – xmllmx
'static_cast '可用於某些標準庫無法使用的環境。所以它比'std :: move'更加兼容。 – xmllmx