隐式生成移动构造函数
Implicitly generate move constructor
是否有任何方法可以隐式生成只移动类的移动构造函数?考虑这样一个类:
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)
不需要复制构造函数。这不会编译,因为编译器似乎不会自动生成移动构造函数,它应该。
除了自己实现或更新编译器之外,没有其他方法可以解决这个问题。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 移动构造函数和右值引用
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- C++:为什么不调用移动构造函数?
- 移动构造函数永远不会被调用
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 运算符+ 的规范实现涉及额外的移动构造函数
- C ++为什么在移动构造函数中需要移动/前进
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- 为什么这里不调用移动构造函数?
- 隐式移动构造函数
- 如何为具有私有成员的派生类实现移动构造函数
- 为什么不调用移动构造函数
- 是否可以避免在以下代码中复制/移动构造函数的需要?