禁用移动构造函数

Disabling move constructor

我想在 class 中禁用移动构造函数。我不想移动,而是基于复制构造函数。当我尝试编写此代码时:

class Boo
{
public:
    Boo(){}
    Boo(const Boo& boo) {};
    Boo(Boo&& boo) = delete;
};

Boo TakeBoo()
{
    Boo b;
    return b;
}

在编译期间我收到错误:

error C2280: 'Boo::Boo(Boo &&)': attempting to reference a deleted function

如何禁用移动构造函数并改为强制复制?

不创建任何移动构造函数:

class Boo
{
public:
    Boo(){}
    Boo(const Boo& boo) {};
};

只要存在用户定义的复制构造函数,就不会自动生成移动构造函数,因此会调用复制构造函数。

将一个函数标记为=delete使该函数可用于重载解析,但如果选择,编译将失败;此功能不限于构造函数和其他特殊函数 (see here)。以前(大约 C++03)使成员私有获得了类似的结果。

因此,示例中的代码实际上意味着您禁止从临时值或过期值(右值)- 移动构造函数构造 class 的对象。

要更正此问题,请完全删除移动构造函数。在 class 的情况下,一旦存在复制构造函数(用户定义),无论如何都不会隐式生成移动(移动构造函数和移动赋值运算符)。

class Boo
{
public:
    Boo(){}
    Boo(const Boo& boo) {};
    //Boo(Boo&& boo) = delete;
};