为什么没有隐式生成的移动构造函数?

时间:2013-04-06 14:36:01

标签: c++ visual-studio-2010 visual-c++ c++11 move-constructor

说,我有一个可移动资源的类作为其成员:

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)构造函数。

UPDATE2

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

UPDATE3

好的,我同意这是重复的,但关闭原因中提供的链接不正确。评论中提供了正确的链接:Why is this copy constructor called rather than the move constructor?

这就是为什么,来自the VC blog

  

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

0 个答案:

没有答案