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