VC2013移动操作符不递归执行移动

时间:2015-02-28 00:06:20

标签: c++ visual-studio-2013 move-semantics

以下代码不在VS2013中编译。

#include <memory>
#include <vector>

struct Struct {
  std::unique_ptr<int> data;
};

int main() {
  std::vector<Struct> vec;
  vec.emplace_back();
  vec.emplace_back();
  vec.front() = std::move(vec.back());
  return 0;
}

我收到以下错误:

error C2280: attempting to reference a deleted function

似乎VS编译器在代码显式请求移动时尝试调用赋值运算符。这是一个错误吗?这个问题有没有解决方法?

1 个答案:

答案 0 :(得分:3)

VS2013不会自动生成所需的构造函数。

  

&#34; Rvalue引用v3.0&#34;添加新规则以自动生成移动   构造函数和在特定条件下移动赋值运算符。   但是,这在Visual Studio 2013中的Visual C ++中未实现,   由于时间和资源的限制。

因此,为了编译程序,您必须至少实现这些构造函数:

struct Struct {
  std::unique_ptr<int> data;

  Struct() { }

  // For exposition purposes only, change as needed
  Struct(Struct&& o) : data(std::move(o.data)) {}

  Struct& operator=(Struct&& other) {
       data = std::move(other.data);
       return *this;
  }
};

似乎是在Microsoft's online compiler, though中实施的。