如何移动构建 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)} {}
};
以下代码在 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)} {}
};