作为新的右值引用和移动语义,我试图从std::vector
派生一个简单的模板类(我保证我会小心缺乏虚拟析构函数)。以“继承”的举动构造函数,我只是调用基类的同行和std::move
,“继承”移动操作无需访问基类成员变量
template <typename T>
class Vec: public std::vector<T> {
public:
...
//move ctors
Vec(Vec&& v): std::vector<T>(v) { //move extra members with std::move }
explicit Vec(std::vector<T>&& v): std::vector<T>(v) { //same as above }
...
};
根据我的C++的理解,这似乎值得信赖。然而,我在我的移动赋值运算符的做法少了很多信心,
//assignment
Vec& operator=(const Vec& v) {
std::vector<T>::operator=(v);
if (&v != this)
//copy extra members
return *this;
}
//move assignment
Vec& operator=(Vec&& v) {
std::vector<T>::operator=(v);
//move extra members with std::move
return *this;
}
这是实现我想要什么的万无一失的方法?在良好实践方面是否有更好的选择?
一个很好的指导原则是[规则零](http://flamingdangerzone.com/cxx11/rule-of-zero/) –
@JonathanWakely尽管我仍然更喜欢在每个地方写'= default'和'= delete'。 – Barry
@巴里,是的,我也是,但我认为仍然遵循规则,只是更明确地表明你有意识地不自己定义成员。 –