2015-09-26 85 views
3

正在調用d-tor內部移動賦值操作符的好習慣嗎?我可以在移動賦值運算符中調用析構函數嗎?

這裏一些示例代碼:

VectorList &operator = (VectorList &&other){ 
    ~VectorList(); // if this is not a good practice, 
        // I will need to paste whole d-tor here. 

    _buffer  = std::move(other._buffer  ); 
    _dataCount = std::move(other._dataCount ); 
    _dataSize = std::move(other._dataSize ); 

    other._clear(); 

    return *this; 
} 

我應該使用此代碼,或者我應該使用交換()與移動構造的對象?

+2

你有沒有考慮到創建「乾淨」的對象和功能,無論是從析構函數和布展assignement操作者調用這個函數? –

+0

非常類似於[通過destruct移動賦值+移動構造安全嗎?](http://stackoverflow.com/questions/13092240/is-move-assignment-via-destructmove-construct-safe?rq=1) –

+1

它是通常不是*析構函數*的工作將對象返回到初始化狀態,所以我會不舒服的做到這一點。爲什麼不調用'this-> clear()'? – Galik

回答

2

斯科特邁爾斯說,不使用swap()http://scottmeyers.blogspot.sg/2014/06/the-drawbacks-of-implementing-move.html

關於你的當前實現,看來你能做到這一點更簡單。我認爲析構函數實際上刪除了_buffer,而且沒有其他東西。如果那是真的,你應該用delete _buffer替換你的難以理性的顯式析構函數調用。

+0

斯科特邁爾斯正是我的觀點 – Nick

+0

@nick互換實施,但嚴格比上述,但。 – Yakk

+1

@Nick斯科特邁爾斯的觀點非常無聲:在三指針分配中時間不會丟失,它在'delete'調用中丟失。如果在緩存中,一個賦值需要5個週期,一個'new' /'delete'對在250個週期的範圍內。而且,'temp = a;之間甚至沒有性能差異。 a = b; b =溫度;刪除b;'和'刪除a; a = b; b = nullptr;':兩個版本都將'a'和'b'加載到寄存器中,然後將值存儲到'a'和'b'。當他寫這篇文章時,斯科特·邁耶斯明顯被「a = b」的抽象所左右。 – cmaster