我想在类中禁用移动构造函数。而不是移动,我想基于复制构造函数。当我尝试编写此代码时:
class Boo
{
public:
Boo(){}
Boo(const Boo& boo) {};
Boo(Boo&& boo) = delete;
};
Boo TakeBoo()
{
Boo b;
return b;
}
在编译期间我收到错误:
错误C2280:'Boo :: Boo(Boo&&)':尝试引用已删除的功能
如何禁用移动构造函数并强制复制?
答案 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;
};