在以下代码中:
class MyClass
{
public:
vector<int> v;
};
MyClass f()
{
MyClass x;
x.v.resize(10);
for (int i = 0; i < 10; i++)
{
x.v[i] = i;
}
return x;
}
void g()
{
MyClass x;
x = f(); // Copy assignment is called for vector<int>
}
使用Visual C ++ 2012在行x = f()
中编译我假设将为向量调用移动赋值。相反,我可以看到调用副本分配。在类中没有定义复制/移动赋值/构造函数,所以我希望编译器会生成默认的移动赋值。如果我使用普通向量而不是MyClass
,则移动分配可以正常工作。这段代码有问题吗?我错过了什么吗?
答案 0 :(得分:2)
您的期望是正确的,gcc 4.7.2会生成默认的移动分配,
vector& operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
。
因此,作为DyP points out,它是Visual Studio 2012中尚未实现的功能。
答案 1 :(得分:1)
作为MSDN states,VS2012尚未隐式声明和定义move-ctors和-assignment-ops:
“Rvalue references v3.0”添加了新规则,以自动生成移动构造函数并在特定条件下移动赋值运算符。但是,由于时间和资源限制,这在Visual Studio 2012中的Visual C ++中未实现。
因此,您必须提供自己的,用户定义的move-ctors和-assignment-ops(可能= default
个)。
如上所述,正如Ali指出的那样,x = f()
确实应该调用MyClass
的move-assignment-op,调用vector
的move-assignment-op