VC2013 搬移运算符不会递归执行搬移操作

3
以下代码在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编译器尝试调用赋值运算符,而代码明确请求移动。这是一个bug吗?有没有解决这个问题的方法?


@pmr 由于使用了 Visual Studio 中的工具和组件,他们可能会被锁定在 VS 中。 - M.M
可能是为什么这段代码尝试调用复制构造函数?的重复问题。 - user3920237
@remyabel 这在使用 Rule of Zero 的编译器中有点令人沮丧。 - M.M
@MattMcNabb 这就解释了为什么他们使用VS。但这并不能解释为什么他们试图将其用作C++11编译器,而它显然不是。 - pmr
在我的VS2013上,我甚至无法编译emplace_back。 - Neil Kirk
显示剩余4条评论
1个回答

3

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

“Rvalue references v3.0”增加了新规则,可以在某些条件下自动生成移动构造函数和移动赋值运算符。然而,在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;
  }
};

它似乎已经在微软的在线编译器中实现了


我认为在线编译器可能是VS2015或其中一个CTP,似乎已经实现了相当多的功能。 - Brandon
@Brandon 在线编译器据说是“最新”的版本,因此它将包含所有最新的功能。另一方面,Rextester则使用Visual Studio 2013。 - user3920237

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接