用实例代码理解一下c++11”定义析构函数阻止合成移动”

来源:互联网 发布:哥贝克力 知乎 编辑:程序博客网 时间:2024/06/01 10:06

先普及一下基本知识:

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;
}

原创粉丝点击