编译器(让我们使用g ++作为具体示例)在编写类时提供默认移动构造函数和默认移动赋值运算符吗?
编译器提供默认值:
编译器是否会提供默认移动构造函数或移动赋值运算符。
答案 0 :(得分:3)
根据cppreference:
隐式声明的移动构造函数
如果没有为类类型提供用户定义的移动构造函数 (struct,class或union),以下所有内容均为真:
- 没有用户声明的复制构造函数
- 没有用户声明的副本分配运算符
- 没有用户声明的移动分配操作符
- 没有用户声明的析构函数 (直到C ++ 14)由于下一节中详述的条件,隐式声明的移动构造函数未被定义为已删除
然后编译器会将移动构造函数声明为非显式 具有签名T :: T(T&&)的
的类内联公共成员。 一个类可以有多个移动构造函数,例如T :: T(const T&&) 和T :: T(T&&)。如果存在一些用户定义的移动构造函数,则 用户可能仍然强制生成隐式声明的移动 带有关键字default的构造函数。
根据cppreference:
隐式声明的移动分配运算符
如果没有为类提供用户定义的移动赋值运算符 type(struct,class或union),以下所有内容均为true:
- 没有用户声明的复制构造函数
- 没有用户声明的移动构造函数
- 没有用户声明的副本分配运算符
- 没有用户声明的析构函数 (直到C ++ 14)隐式声明的移动赋值运算符不会被定义为已删除
然后编译器将一个移动赋值运算符声明为内联 同类公共成员,签名T& T ::运算符=(T&安培;&安培)。
一个类可以有多个移动赋值运算符,例如T& T& T :: operator =(const T&&)和T& T ::运算符=(T&安培;&安培)。如果用户定义了一些 移动赋值运算符存在,用户可能仍然强制执行 生成隐式声明的移动赋值运算符 关键字默认。
因为总是为某些赋值运算符(移动或复制)声明 任何类,基类赋值运算符始终是隐藏的。如果一个 using-declaration用于从中引入赋值运算符 基类,其参数类型可以与参数相同 派生类的隐式赋值运算符的类型 隐式声明也隐藏了using声明。