如何移动 - 构建C++ STL映射?

Moh*_*han 2 c++ stl move-constructor move-semantics

以下代码在GCC 4.9.3下引发错误.

    #include <map>
    using namespace std;

    struct Movable {
        Movable(const Movable&) = delete;
        Movable(Movable&&) = default;
    };

    class Foo {
        const map<int, Movable> m;
        Foo(map<int, Movable>&& _m) : m{_m} {}
    };
Run Code Online (Sandbox Code Playgroud)

潜在的错误是use of deleted function 'Movable::Movable(const Movable&)'- 但AFAICS它不应该试图复制底层的Movable.

Jar*_*d42 8

由于_m有名称,使用时它是左值,你必须使用std::move:

class Foo {
    const map<int, Movable> m;
    Foo(map<int, Movable>&& _m) : m{std::move(_m)} {}
};
Run Code Online (Sandbox Code Playgroud)