簡體   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