0

在以下代码中:

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移动分配工作正常。这段代码有问题吗?我错过了什么吗?

4

2 回答 2

2

您的期望是正确的,并且 gcc 4.7.2 确实生成了默认的移动分配,即

vector& operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())

正如您所期望的那样被调用。

因此,正如DyP 指出的那样,它是 Visual Studio 2012 中尚未实现的功能。

于 2013-07-12T08:03:52.133 回答
1

正如MSDN 所说,VS2012 尚未隐式声明和定义 move-ctors 和 -assignment-ops:

《Rvalue references v3.0》增加了新规则,在特定条件下自动生成移动构造函数和移动赋值运算符。但是,由于时间和资源限制,这在 Visual Studio 2012 的 Visual C++ 中没有实现。

因此,您必须提供自己的、用户定义的 move-ctors 和 -assignment-ops(也许= default就足够了)。

也就是说,正如Ali指出的那样,x = f()确实应该调用 的 move-assignment-op MyClass,调用 的 move-assignment-op vector

于 2013-07-12T12:26:44.977 回答