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年试过。