10.2.1 non-copyable
“面向对象”章节为了让某类对象不可被复制,方法是将其复制构造和赋值操作符重载函数都声明为“=delete”,更早之前的做法则是将二者私有化。这些动作可以“模板化”,加引号是因为并不一定采用模板技术,而是想说明这类操作可以套某种特定模式以便快速实现。
boost就为我们提供了“non-copyable”工具类:
从boost::noncopyable派生,只是为了让当前类拥有基类中已“私有化”的,或已声明为“被删除”的复制构造和赋值操作符重载,所以非常适合使用“私有派生”方式。
相比为每个不需要复制功能的类写下复制构造和赋值操作的“delete”声明,来自boost的noncopyable可以让我们写更少的代码,并且在语义上,“noncopyable”这个词表一更加清楚。不过,如果因此引入boost库,可能会感觉代价有点答,为什么不直接学着实现一个呢?
测试如下:
看着源代码有利于分析:当编译器试图产生ms2从ms复制构造时,需要生成复制其基类部分的代码(尽管基类没有任何成员数据)。于是发现基类禁止了复制行为,于是报错。