可以删除(或默认)非特殊C ++成员函数吗?

时间:2014-07-10 12:03:52

标签: c++ c++11

= default= delete已经收到很多关于特殊成员(默认构造函数,析构函数,复制和移动)的注意事项。 = default= delete可以与其他功能一起使用;成员函数,自由函数和运算符等?

我可以理解= default可能不会被允许在特殊成员之外;因为它基本上是说使用编译器生成的默认。在编译器能够生成默认值之前,需要明确定义默认值。据我所知,只有特殊成员才有这些预先定义的默认值。

= delete怎么样;它基本上是说声明了函数,但实现明确没有定义

  • = delete能否与特殊成员以外的其他功能一起使用?
  • 可以使用哪些函数类型(成员,非成员,运算符等)?
  • 或者相反,禁止使用= delete的地方(或何时)?它的使用有任何限制吗?

1 个答案:

答案 0 :(得分:10)

任何函数都可以声明为已删除(使用= delete)。该标准没有任何限制。这由C ++ 11 [dcl.fct.def.delete]涵盖。它甚至提供了已删除的operator new

的示例

另一方面,默认函数 受[dcl.fct.def.default]§1的限制,如下所示:

  

1 ...明确默认的功能

     
      
  • 是一个特殊的会员功能,
  •   
  • 具有相同的声明函数类型(可能不同的 ref-qualifiers 除外,在复制构造函数或复制赋值运算符的情况下,参数类型可能是“引用   非const T“,其中T是成员函数类的名称)   好像它已被隐式声明,
  •   
  • 没有默认参数。
  •   

第一个要点中引用的“特殊成员函数”(根据[特殊]§1):

  • 默认构造函数
  • 复制构造函数
  • 移动构造函数
  • 复制分配操作员
  • 移动赋值运算符