移动构造和移动赋值
在C++98中,我们自定义的类,会默认生成拷贝赋值操作符函数和拷贝赋值函数以及析构函数;
在C++11中,依赖于新增的move语义,默认生成的函数多了2个移动相关的:移动赋值操作符(moveassignment)和移动构造函数(moveconstructor);
BS建议,如果你显式声明了上述5个函数或操作符中的任何一个,你必须考虑其余的4个,并且显式地定义你需要的操作,或者使用这个操作的默认行为。
一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将不会默认自动生成move操作。
一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将默认自动生成所有的拷贝操作。但是,我们应该尽量避免这种情况的发生,不要依赖于编译器的默认动作。
如果你声明了上述5个默认函数中的任何一个,强烈建议你显式地声明所有这5个默认函数。例如:
- template<class T>
- class Handle {
- T* p;
- public:
- Handle(T* pp) : p{pp} {}
- // 用户定义构造函数: 没有隐式的拷贝和移动操作
- ~Handle() { delete p; }
- Handle(Handle&& h) :p{h.p}
- { h.p=nullptr; };
- // transfer ownership
- Handle& operator=(Handle&& h)
- { delete p; p=h.p; h.p=nullptr; }
- // 传递所有权
- Handle(const Handle&) = delete;
- // 禁用拷贝构造函数
- Handle& operator=(const Handle&) = delete;
- // ...
- };
FROM: http://www.itatedu.com/news/wa2016032916002955299190.shtml