2

比如说,我有一个以可移动资源为成员的类:

struct A {
  std::vector<int> v;
};

有一个隐式生成的复制构造函数,它工作得很好,大致如下实现:

// Implicitly generated copy constructor
A(const A& rhs) : v(rhs.v) {};

而且我希望在 C++11 中以相同的方式隐式生成移动构造函数:

// Move constructor is not implicitly generated, why?
A(A&& rhs) : v(std::move(rhs.v)) {};

但是,至少在 Visual Studio 2010 中不会隐式生成移动构造函数。并且在以下代码中复制了一个向量:

A a;
A b(std::move(a));  // a.v is copied, not moved

我的问题是——为什么?在我看来,编译器隐式生成移动构造函数的副本没有区别 - 它具有这两个的完整信息。

或者也许移动构造函数应该由标准生成,但 Visual Studio 不这样做?

更新

我调试了代码,并在文件vector(const _Myt& _Right)中调用了构造函数。<vector>当我显式编写移动构造函数时,vector(_Myt&& _Right)会调用构造函数。

更新2

刚刚检查过:Visual Studio 2012 Update 1 中的行为相同。

更新3

好的,我同意这是重复的,但关闭原因中提供的链接不正确。评论中提供了正确的链接:为什么调用这个复制构造函数而不是移动构造函数?

这就是为什么,来自VC 博客

右值引用 v3.0 添加了新规则,可以在特定条件下自动生成移动构造函数和移动赋值运算符。这不会在 VC11 中实现,它将继续遵循 VC10 的从不自动生成移动构造函数/移动赋值运算符的行为。(与此处所有尚未实现的功能一样,这是由于时间和资源限制,而不是由于不喜欢这些功能本身!)

4

0 回答 0