[英]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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.