隐式生成移动构造函数

时间:2012-11-21 15:51:19

标签: c++ visual-c++ c++11 visual-studio-2012 move-semantics

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

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没有用户声明的析构函数,

     

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

1 个答案:

答案 0 :(得分:4)

  

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

不需要复制构造函数。这不能编译,因为你的编译器似乎没有自动生成一个移动构造函数,它应该

除了自己实现或更新编译器之外,别无他法。