1、定义删除的函数
在新标准下,我们可以通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数(deleted C++function)来阻止拷贝。删除的函数是这样一种函数:我们虽然声明了它们, 但不能以任何方式使用它们。在函数的参数列表后面加上=delete来指出我们希望将它定义为删除的:
struct NoCopy {
NoCopy () = default; //使用合成的默认构造函数
NoCopy(const NoCopy&) = delete; // 阻止拷贝
NoCopy &operator= (const NoCopy&) = delete; // 阻止赋值
-NoCopy () = default; //使用合成的析构函数
//其他成员 ...
};
- =delete通知编译器(以及我们代码的读者), 我们不希望定义这些成员。与=default不同, =delete必须出现在函数第一次声明的时候, 这个差异与这些声明的含义在逻辑上是吻合的。一个默认的成员只影响为这个成员而生成的代码, 因此=default直到编译器生成代码时才需要。而另一方面,编译器需要知道一个函数是删除
的, 以便禁止试阳使用它的操作。- 与=default的另一个不同之处是, 我们可以对任何函数指定=delete(我们只能对编译器可以合成的默认构造函数或拷贝控制成员使用=default)。虽然删除函数的主要用途是禁止拷贝控制成员,但当我们希望引导函数匹配过程时, 删除函数有时也是有用的。