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

Can non-special C++ member functions be deleted (or defaulted)?

本文关键字:c++ 成员 函数 非特 删除 默认      更新时间:2023-10-16

= default= delete在特殊成员(默认构造函数、析构函数、复制和移动)方面得到了很多关注。= default= delete能否与其他功能配合使用?成员函数,自由函数和操作符等等?

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

= delete;它的基本意思是声明了函数,但没有显式地定义实现

  • = delete可以与特殊成员以外的函数一起使用吗?
  • 它可以用于哪些函数类型(成员、非成员、操作符等)?
  • 或者相反,在哪里(或何时)禁止使用= delete ?它的使用有什么限制吗?

任何函数都可以声明为已删除(使用= delete)。该标准没有施加任何限制。c++ 11[dcl.fct.def.delete]涵盖了这一点。它甚至给出了一个删除operator new的例子。

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

1…显式默认的函数

  • 是一个特殊的成员函数,
  • 具有相同的声明函数类型(除了可能有不同的ref-qualifier ,并且在复制构造函数或复制赋值操作符的情况下,形参类型可以是"引用")非const T ",其中T是成员函数的类名)就好像它已经被隐式声明过,并且
  • 没有默认参数

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

  • 默认构造函数
  • 拷贝构造函数
  • <
  • 转移构造函数/gh>
  • 复制赋值操作符
  • 移动赋值算子
  • 析构函数