gpt4 book ai didi

c++ - 为什么要在单例中删除 move 构造函数和 move 赋值运算符?

转载 作者:IT老高 更新时间:2023-10-28 22:17:54 25 4
gpt4 key购买 nike

我有以下单例策略类实现:

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
};

我不明白为什么要删除 move 构造函数和赋值运算符。你能给我一个例子,如果我不删除(根本不定义) move ctor 和赋值运算符,我最终会破坏单例吗?

最佳答案

如果你声明了一个复制构造函数(即使你在声明中将它定义为deleted),也不会隐式声明任何 move 构造函数。参照。 C++11 12.8/9:

If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared as defaulted if and only if

— X does not have a user-declared copy constructor,

— ...

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

关于c++ - 为什么要在单例中删除 move 构造函数和 move 赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23771194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com