用實例代碼理解一下c++11”定義析構函數阻止合成移動”

先普及一下基本知識:

1、移動:int &&a = b;  將b移動給a,會避免一些對象複製,移動之後,b就沒有用了。

2、析構:對象釋放時,執行的清理函數。

原理很好理解:如果定義了析構函數,則說明清理工作有一些個性化,成員數據如果執行了移動 ,會產生掃尾時,數據已經無效了或繼續有效,但操作會影響其他對象。這個時間,會執行拷貝代替移動 。

通過以下代碼的差異化,可以感受一下:

1、F2有一個F類型的成員,通過顯示定義拷貝和移動,打出日誌來查看過程。

2、調用test時,傳遞參數,執行了一次拷貝,輸出new

3、返回值賦值給f3時,執行移動,定義~F2則無法執行移動,執行了拷貝。

class F
{
public:
    F() = default;
    F(const F& f) { cout << "new" << endl; }               //顯示定義拷貝構造
    F(const F&& f) { cout << "move" << endl; }             //顯示定義移動構造
    F& operator=(const F& f) { cout << "eq" << endl; }
};
class F2
{
public:
    F m_f1;
    ~F2() { }       //加這行,輸出2個new,不加輸出new和move
};
F2 test(F2 f) { return f; }
int main()
{
    F2 f1;
    F2 &&f3 = test(f1);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章