如何将不可复制和不可移动的对象分配到std :: map中?

时间:2014-10-13 14:44:41

标签: c++ c++11 move-semantics stdmap

我有一个对象,我想限制只在std::map内部分配。这是简化的代码:

#include <map>

class Value
{
public:
    Value(int value) { _value = value;}
    Value(const Value&) = delete;
    Value& operator=(const Value&) = delete;
    Value(Value&&) = default;     // ***
    void* operator new(size_t) = delete;    // not on free store
private:
    int _value;
};

class Container
{    
public:
    Container();
    Value* addToMap(int key) {
        auto ret = _map.emplace(key, key);
        return &(ret.first->second);
    }
private:
    std::map<int, Value> _map;
};

为了使用CLang在Mac上进行编译,我必须添加一个标有星号的行,请求默认的移动构造函数。但是,在Windows Visual Studio中编译时,此行会导致C2610错误。看起来VS2013 C ++ 11不合规包括无法生成默认移动构造函数。我是否有不同的方式在标准映射中分配一个可以跨平台编译的对象,还是我必须实现自己的移动构造函数?

1 个答案:

答案 0 :(得分:8)

选项是使用std::piecewise_construct

Value* addToMap(int key) {
    auto ret = _map.emplace(std::piecewise_construct
                          , std::forward_as_tuple(key)
                          , std::forward_as_tuple(key));
    return &(ret.first->second);
}

VC++ DEMO