要点:显示禁止不想使用的编译器合成函数。
条款5中叙述了编译器可能合成四类函数。在某些情况下,如作者例子中“要出售房屋”实例,不希望有Copy构造和赋值操作。补充例子:Singleton模式。
有两种做法:
1) 将Copy构造和赋值操作声明为private,不提供函数实现。
1.1 声明Copy构造和赋值操作后,编译器不会再合成
1.2 声明为private,除成员和友元函数外,访问将产生编译错误
1.3 不提供实现,确保即使成员或友元函数调用它们,也会产生链接错误
1.4 仅声明不实现,参数列表中的参数名可省略。
2) 从Uncopyable类private继承,该类用方式1)实现。
2.1 编译器合成的子类Copy构造和赋值操作会调用基类对应的函数,由于基类对应函数是private,故会产生编译错误
2.2 采用private继承。一般的,public继承描述is-a关系,private继承描述implement-by关系
2.3 基类析构函数不是virtual的(参见条款7),原因是Uncopyable类设计意图不是作为多态基类使用
2.4 由于Uncopyable不含成员变量,故编译器可能进行“空基类优化”(Empty Base Class Optimization),参见条款39
2.5 Boost库中已经有一个名为noncopyable的类,实现该功能。