vso*_*tco 16 c++ singleton move-semantics c++11
我有以下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;
}
};
Run Code Online (Sandbox Code Playgroud)
然后我通过奇怪的重复模板模式(CRTP)使用
class Foo: public Singleton<Foo> // now Foo is a Singleton
{
friend class Singleton<Foo>;
~Foo(){}
Foo(){};
public:
// rest of the code
};
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么我应该删除移动构造函数和赋值运算符.你能给我一个例子,如果我不删除(根本没有定义)移动ctor和赋值运算符,我最终会破坏单例吗?
Ker*_* SB 33
如果声明了一个复制构造函数(即使delete在声明中将其定义为d),也不会隐式声明移动构造函数.参看 C++ 11 12.8/9:
如果类的定义
X没有显式声明一个移动构造函数,那么当且仅当一个类的定义被隐式声明为默认值时- X没有用户声明的复制构造函数,
- ......
由于您确实拥有用户声明的复制构造函数,因此如果您没有声明复制构造函数,则根本不会有移动构造函数.所以你可以完全摆脱移动构造函数声明定义.移动赋值运算符也是如此.
| 归档时间: |
|
| 查看次数: |
11295 次 |
| 最近记录: |