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

标签 c++ c++11

关于特殊成员(默认构造函数、析构函数、复制和移动),= default= delete 受到了很多关注。 = default= delete 可以和其他函数一起使用吗?成员函数、自由函数和运算符等?

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

= delete呢?它基本上是说声明了函数,但未明确定义实现

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

最佳答案

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

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

1 ... A function that is explicitly defaulted shall

  • be a special member function,
  • have the same declared function type (except for possibly differing ref-qualifiers and except that in the case of a copy constructor or copy assignment operator, the parameter type may be “reference to non-const T”, where T is the name of the member function’s class) as if it had been implicitly declared, and
  • not have default arguments.

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

  • 默认构造函数
  • 拷贝构造函数
  • 移动构造函数
  • 复制赋值运算符
  • 移动赋值运算符
  • 析构函数

关于c++ - 可以删除(或默认)非特殊 C++ 成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24676081/

相关文章:

c++ - “does not name a type” 错误 C++

c++ - 为什么 bind 在 lambda 工作时什么都不做

C++ thread_id 是什么数据类型,它可以分配给变量吗?

c++ - 为什么要调用基础构造函数?

c++ - 当我们可以更有效地使用 vector 来实现优先级队列时,为什么要使用堆来实现它

C++ 执行终止并重新启动当前进程的 bash 脚本

c++ - Linux perf 无法解析某些以 0xffffffff 开头的高地址符号

c++ - 特质和政策有什么区别?

C++(11) 函数的默认参数作为模板参数或函数指针

c++ - 在 C++11 中更改了默认初始化的含义?