std :: vector :: erase()不想移动

sts*_*ler 10 c++ move c++11

我有一个std::vector<Foo>地方Foo是含有类Foo( Foo&& ) noexcept.

向容器添加对象可以完美地工作,但是使用std::vector::erase( iterator )它不会使用它们,GCC 4.7会尝试调用我删除的赋值运算符.确切的错误消息是:

错误:使用已删除的函数'Foobar&Foobar :: operator =(const Foobar&)

编辑:当然std::vector调用赋值运算符,而不是复制构造函数(您也可以在错误消息中看到).对不起,在说明中修正了它.

以下是请求的示例源代码:

#include <vector>

class Foo {
    public:
        Foo() {}
        Foo( Foo&& other ) noexcept {}

        Foo( const Foo& ) = delete;
        Foo& operator=( const Foo& ) = delete;
};

int main() {
    std::vector<Foo> v;

    v.push_back( Foo{} );
    v.erase( v.begin() );
}
Run Code Online (Sandbox Code Playgroud)

Pup*_*ppy 11

问题是您没有提供移动赋值运算符.这是某些功能的矢量Movable要求的一部分.