比如说,我有一个以可移动资源为成员的类:
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 的从不自动生成移动构造函数/移动赋值运算符的行为。(与此处所有尚未实现的功能一样,这是由于时间和资源限制,而不是由于不喜欢这些功能本身!)