编译器是否提供默认的移动赋值运算符和移动构造函数?

时间:2015-08-26 11:50:39

标签: c++11 move-semantics

编译器(让我们使用g ++作为具体示例)在编写类时提供默认移动构造函数和默认移动赋值运算符吗?

编译器提供默认值:

  • 构造函数(无参数),除非声明了另一个带参数的构造函数。
  • 析构函数(可能什么也不做? - 实际上并不完全,这个问题有答案here,它调用基类析构函数)
  • 复制构造函数,除非我们自己编写
  • 复制分配操作员,除非我们自己编写

编译器是否会提供默认移动构造函数或移动赋值运算符。

1 个答案:

答案 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声明。