用实例代码理解一下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;
}

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