禁用移动构造函数

时间:2016-02-15 09:36:04

标签: c++ c++11 move

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

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

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

在编译期间我收到错误:

  

错误C2280:'Boo :: Boo(Boo&&)':尝试引用已删除的功能

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

2 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:4)

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

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

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

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