隐式生成移动构造函数

Implicitly generate move constructor

本文关键字:移动 构造函数      更新时间:2023-10-16

是否有任何方法可以隐式生成只移动类的移动构造函数?考虑这样一个类:

class moveable_only
{
unique_ptr<int> p_;
};
moveable_only m;
foo(std::move(m));

这不会编译,因为隐式声明的复制构造函数不能复制p_。(12.8/7)

如果类定义没有显式声明复制构造函数,则隐式声明一个。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除;否则,它被定义为默认值(8.4)。

现在考虑一下:

class moveable_only
{
unique_ptr<int> p_;

moveable_only(const moveable_only&);
moveable_only& operator = (const moveable_only&);
};
moveable_only m;
foo(std::move(m));

由于12.8/9的原因,这并不能很好地编译

如果类X的定义没有显式声明移动构造函数,则当且仅当

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

--X没有用户声明的副本分配运算符

--X没有用户声明的移动分配运算符

--X没有用户声明的析构函数,并且

--move构造函数不会被隐式定义为已删除。

这不会编译,因为隐式声明的复制构造函数无法复制p_。(12.8/7)

不需要复制构造函数。这不会编译,因为编译器似乎不会自动生成移动构造函数,它应该

除了自己实现或更新编译器之外,没有其他方法可以解决这个问题。