= default 和 = delete

在C++中,声明自定义的类型之后,编译器会默认生成一些成员函数,这些函数被称为默认函数。其中包括:
(1)(默认)构造函数
(2)拷贝(复制)构造函数
(3)拷贝(复制)赋值运算符
(4)移动构造函数
(5)移动赋值运算符
(6)析构函数
另外,编译器还会默认生成一些操作符函数,包括:
(7)operator ,
(8)operator &
(9)operator &&
(10)operator
(11)operator ->
(12)operator ->

(13)operator new
(14)operator delete

= default 显示缺省函数

如果类设计者又实现了这些函数的自定义版本后,编译器就不会去生成默认版本。
大多数时候,我们需要声明带参数的构造函数,此时就不会生成默认构造函数,这样会导致类不再是POD类型(可参见随笔《C++11 POD类型》)。
明确默认的函数声明式一种新的函数声明方式,在 C++11 发布时做出了更新。C++11 允许添加 =default 说明符到函数声明的末尾,以将该函数声明为显示默认构造函数。这就使得编译器为显示默认函数生成了默认实现,它比手动编程函数更加有效。

= delete 显示删除函数

另一方面,有时候可能需要限制一些默认函数的生成。
例如:需要禁止拷贝构造函数的使用。以前通过把拷贝构造函数声明为private访问权限,这样一旦使用编译器就会报错。
而在 C++11 中,只要在函数的定义或者声明后面加上”= delete”就能实现这样的效果(相比较,这种方式不容易犯错,且更容易理解)。
在C ++ 11之前,操作符delete 只有一个目的,即释放已动态分配的内存。而C ++ 11标准引入了此操作符的另一种用法,即:禁用成员函数的使用。这是通过附加= delete来完成的; 说明符到该函数声明的结尾。
使用’= delete’说明符禁用其使用的任何成员函数称为expicitly deleted函数。

What does “default” mean after a class’ function declaration?

It’s a new C++11 feature.
It means that you want to use the compiler-generated version of that function, so you don’t need to specify a body.
You can also use = delete to specify that you don’t want the compiler to generate that function automatically.
With the introduction of move constructors and move assignment operators, the rules for when automatic versions of constructors, destructors and assignment operators are generated has become quite complex. Using = default and = delete makes things easier as you don’t need to remember the rules: you just say what you want to happen.

参考

  1. C++ =default 和 = delete
  2. C++ =default 和 = delete
  3. cppreference default constructor