在C++11中,如果基类已经定义了自己的move (copy)构造函数(赋值操作符),那么它的子类是否需要定义自己的move (copy)构造函数(赋值操作符),其中调用基类的相应构造函数/操作符被显式调用?
每次清晰地定义构造函数、析构函数、移动/复制构造函数(赋值操作符)是个好主意吗?
struct Base {
Base() {}
Base(Base&& o);
};
struct Sub : public Base {
Sub(Sub&& o) ; // Need I do it explicitly ? If not,what the compiler will do for me
};发布于 2014-09-04 11:57:04
如果没有在基类中指定默认的移动构造函数(除了有些案件,例如有一个带有删除的移动构造函数的基类),编译器将生成默认的移动构造函数,但是无论如何,如果您有基类,则应该显式地调用它:
Sub(Sub&& o) : Base(std::move(o))发布于 2014-09-04 11:57:28
发布于 2014-09-04 12:01:50
不,你没有。我将像默认/复制构造函数一样自动生成。
来自此页,
隐式声明的移动构造函数 如果没有为类类型(struct、class或union)提供用户定义的移动构造函数,那么以下所有内容都是正确的: 没有用户声明的副本构造函数,也没有用户声明的副本分配操作符,也没有用户声明的移动分配操作符,也没有用户声明的析构函数(直到C++14),由于下一节详细介绍的条件,隐式声明的移动构造函数没有被定义为已删除。 然后,编译器将一个move构造函数声明为其类的内联公共成员,签名为T::t(T&)。 类可以具有多个移动构造函数,例如T::T(const T&&)和T::T(T&&)。如果存在某些用户定义的移动构造函数,则用户仍然可以强制生成带有关键字默认值的隐式声明的move构造函数。
您的struct Sub没有用户声明的副本构造函数、副本分配运算符、移动赋值运算符或析构函数.
和,
平凡移动构造函数 如果以下所有内容都为真,那么T类的move构造函数就很简单: 它不是用户提供的(意思是,它是隐式定义的或默认的),如果它是默认的,它的签名与隐式定义的T没有虚拟成员函数T没有虚拟基类T的移动构造函数是微不足道的,为每个非静态类类型(或类类型数组)选择的移动构造函数是微不足道的,T没有易失性限定类型的非静态数据成员。 (自C++14以来) 平凡的移动构造函数是一个构造函数,它执行与普通复制构造函数相同的操作,也就是说,使对象表示的副本就像通过std::memmove那样。所有与C语言兼容的数据类型(POD类型)都是可移动的。 隐式定义的移动构造函数 如果隐式声明的move构造函数既不删除也不琐碎,则编译器将定义它(即生成和编译函数体)。对于联合类型,隐式定义的移动构造函数复制对象表示(如std::memmove)。对于非联合类类型(类和结构),构造函数按照初始化顺序对对象的基和非静态成员执行完全成员级移动,使用带有xvalue参数的直接初始化。
Base的move构造函数并不简单(它是用户定义的)。因此,隐式定义的Sub移动构造函数将作为“移动构造器按照初始化顺序执行对象基和非静态成员的完整成员级移动,使用带有xvalue参数的直接初始化。”
https://stackoverflow.com/questions/25664694
复制相似问题