繁体   English   中英

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

[英]How to allocate a non-copyable and non-movable object into std::map?

我有一个对象,我想限制只在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不合规包括无法生成默认移动构造函数。 我是否有不同的方式在标准映射中分配一个可以跨平台编译的对象,还是我必须实现自己的移动构造函数?

一个选项是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM