【发布时间】:2012-11-09 22:08:03
【问题描述】:
是否可以隐式生成仅移动类的移动构造函数?考虑这样一个类:
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 没有用户声明的析构函数,并且
——移动构造函数不会被隐式定义为已删除。
【问题讨论】:
标签: c++ visual-c++ c++11 visual-studio-2012 move-semantics