C++11 未为成员变量调用移动分配
在以下代码中:C++11 未为成员变量调用移动分配,c++11,visual-c++-2012,C++11,Visual C++ 2012,在以下代码中: 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 assig
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>
}
class-MyClass
{
公众:
向量v;
};
MyClass f()
{
MyClass x;
x、 v.调整大小(10);
对于(int i=0;i<10;i++)
{
x、 v[i]=i;
}
返回x;
}
void g()
{
MyClass x;
x=f();//为向量调用复制赋值
}
用VisualC++ 2012编译,代码< x= f~()>代码>,我假定向量的移动赋值。相反,我可以看到副本分配被调用。类中没有定义复制/移动分配/构造函数,因此我希望编译器能够生成默认的移动分配。如果我使用普通向量而不是
MyClass
,则移动分配工作正常。这个代码有什么问题吗?我遗漏了什么吗?您的期望是正确的,gcc 4.7.2确实生成了默认的移动分配,即
vector&operator=(vector&&uuux)无异常(\u Alloc\u traits::\u S\u nothrow\u move())
被调用,正如您所期望的
因此,它是Visual Studio 2012中尚未实现的功能。您的期望是正确的,gcc 4.7.2确实生成了默认移动分配,即
vector&operator=(vector&&uuux)无异常(\u Alloc\u traits::\u S\u nothrow\u move())
被调用,正如您所期望的
因此,作为,它是Visual Studio 2012中尚未实现的功能。作为,VS2012尚未隐式声明和定义移动因子和-分配操作:
“Rvalue references v3.0”添加了新规则,以在特定条件下自动生成移动构造函数和移动分配运算符。但是,由于时间和资源限制,VisualStudio 2012中没有在VisualC++中实现。
因此,您必须提供自己的、用户定义的move-ctors和-assignment-op(可能=default
就足够了)
也就是说,正如所指出的,x=f()
确实应该调用MyClass
的移动赋值op,调用vector
的移动赋值op,因为VS2012尚未隐式声明和定义移动构造函数和-assignment op:
“Rvalue references v3.0”添加了新规则,以在特定条件下自动生成移动构造函数和移动分配运算符。但是,由于时间和资源限制,VisualStudio 2012中没有在VisualC++中实现。
因此,您必须提供自己的、用户定义的move-ctors和-assignment-op(可能=default
就足够了)
也就是说,正如所指出的,
x=f()
确实应该调用MyClass
的移动赋值op,调用vector
的移动赋值op,我认为您可能必须为MyClass
定义自己的移动构造函数,如下所示:“'Rvalue references v3.0'添加了新规则,以在特定条件下自动生成移动构造函数和移动分配运算符。但是,由于时间和资源限制,VisualStudio 2012中没有在VisualC++中实现这一点。“@DyP谢谢你。不幸的是,VS2013也没有。我认为你的评论应该是公认的答案。如果添加一个用户定义的move-ctor是正确的,也许可以解决这个问题。我无法用VS2012 atm测试这一点。*应该是一个移动分配op;)它确实解决了问题。我在VC2012中尝试过。我认为您可能必须为MyClass
定义自己的移动构造函数,如下所示:“'Rvalue references v3.0'添加了新规则,以在特定条件下自动生成移动构造函数和移动分配运算符。但是,由于时间和资源限制,VisualStudio 2012中没有在VisualC++中实现这一点。“@DyP谢谢你。不幸的是,VS2013也没有。我认为你的评论应该是公认的答案。如果添加一个用户定义的move-ctor是正确的,也许可以解决这个问题。我无法用VS2012 atm测试这一点。*应该是一个移动分配op;)它确实解决了问题。我在2012年试过。