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

How can one move-construct a C++ STL map?

以下代码在 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} {}
    };

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

因为_m有名字,所以用的时候是左值,所以要用std::move:

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