不会为成员变量调用移动分配

时间:2013-07-12 04:41:04

标签: 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 assignment is called for vector<int>
}

使用Visual C ++ 2012在行x = f()中编译我假设将为向量调用移动赋值。相反,我可以看到调用副本分配。在类中没有定义复制/移动赋值/构造函数,所以我希望编译器会生成默认的移动赋值。如果我使用普通向量而不是MyClass,则移动分配可以正常工作。这段代码有问题吗?我错过了什么吗?

2 个答案:

答案 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