我有以下Singleton策略类实现:
template <typename T>
class Singleton
{
Singleton(){}; // so we cannot accidentally delete it via pointers
Singleton(const Singleton&) = delete; // no copies
Singleton& operator=(const Singleton&) = delete; // no self-assignments
Singleton(Singleton&&) = delete; // WHY?
Singleton& operator=(Singleton&&) = delete; // WHY?
public:
static T& getInstance() // singleton
{
static T instance; // Guaranteed to be destroyed.
// Instantiated on first use.
// Thread safe in C++11
return instance;
}
};
然后我通过奇怪的重复模板模式(CRTP)使用
class Foo: public Singleton<Foo> // now Foo is a Singleton
{
friend class Singleton<Foo>;
~Foo(){}
Foo(){};
public:
// rest of the code
};
我无法弄清楚为什么我应该删除移动构造函数和赋值运算符。你能给我一个例子,如果我不删除(根本没有定义)移动ctor和赋值运算符,我最终会破坏单例吗?
答案 0 :(得分:30)
如果声明了一个复制构造函数(即使你在声明中将其定义为delete
d),也不会隐式声明移动构造函数。参看C ++ 11 12.8 / 9:
如果类
时,将隐式声明一个默认值。X
的定义未明确声明移动构造函数,则当且仅当- X没有用户声明的复制构造函数,
- ...
由于您确实拥有用户声明的复制构造函数,因此如果您没有声明复制构造函数,则根本不会有移动构造函数。所以你可以完全摆脱移动构造函数声明定义。移动赋值运算符也是如此。