不可复制noncopyable

class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private:
noncopyable(const noncopyable &orig);
noncopyable & operator=(const noncopyable &rhs);
};

class A : private noncopyable
{
public:
A & operator=(const A &rhs) {}
};

class B : private noncopyable
{};

int main()
{

A a1,a2;
B b1,b2;

a1 = a2; // ok
b1 = b2; // error
}

首先,构造函数和析构函数设置为protected,这样子类能够调用,但是却不能被外部调用。其次,拷贝构造函数和赋值运算符设置为私有的,并且只声明不实现。对于类A而言,它自己又实现了赋值运算符,并且在实现中它没有去调用父类的赋值运算符,所以是ok的。对于类B而言,它自己没有实现赋值运算符,那么编译器会自动合成一个,合成的赋值运算符会去调用父类的私有的赋值运算符从而导致编译失败。如果没有a1=a2这个语句,即没有需要赋值运算符的地方,则编译器不会为类A自动合成赋值运算符。