为什么我要删除移动构造函数并在单例中移动赋值运算符?

时间:2014-05-20 22:43:46

标签: c++ c++11 singleton move-semantics

我有以下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和赋值运算符,我最终会破坏单例吗?

1 个答案:

答案 0 :(得分:30)

如果声明了一个复制构造函数(即使你在声明中将其定义为delete d),也不会隐式声明移动构造函数。参看C ++ 11 12.8 / 9:

  

如果类X的定义未明确声明移动构造函数,则当且仅当

时,将隐式声明一个默认值。      

- X没有用户声明的复制构造函数,

     

- ...

由于您确实拥有用户声明的复制构造函数,因此如果您没有声明复制构造函数,则根本不会有移动构造函数。所以你可以完全摆脱移动构造函数声明定义。移动赋值运算符也是如此。