C++ 使用运算符[]访问唯一\u ptr的私有std::map

C++ 使用运算符[]访问唯一\u ptr的私有std::map,c++,c++11,unique-ptr,stdmap,C++,C++11,Unique Ptr,Stdmap,我有一个类,它有一个私有的std::映射,映射为唯一的\u ptr: class MyClass{ std::map <KeyType, std::unique_ptr<my_type>> my_map; ... }; class-MyClass{ 映射我的地图; ... }; 我选择unique_ptr是因为我的_映射是我的_类型对象的唯一所有者 我想公开一个operator[]public member函数来访问(完美转发)我的地图。 比如: // my_clas

我有一个类,它有一个私有的std::映射,映射为唯一的\u ptr:

class MyClass{
std::map <KeyType, std::unique_ptr<my_type>> my_map;
...
};
class-MyClass{
映射我的地图;
...
};
我选择unique_ptr是因为我的_映射是我的_类型对象的唯一所有者

我想公开一个operator[]public member函数来访问(完美转发)我的地图。 比如:

// my_class is of type MyClass
auto ptr = my_type_factory(...); // my_type_factory returns a std::unique_ptr<my_type>
....
my_class[1] = std::move(auto_ptr);
//my_类是MyClass类型
自动ptr=my_type_factory(…);//my_type_工厂返回一个std::unique_ptr
....
my_class[1]=std::move(自动_ptr);
我尝试了运算符[]的各种可能定义:

class MyClass{
....
public:
auto operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; } 
// or return & my_map[...];
};
class-MyClass{
....
公众:
自动运算符[](键类型和键){return my_map[std::forward(键)];}
//或者返回&my_map[…];
};
但它不起作用,最后我总是调用unique_ptr的deleted copy构造函数

P> >向前移动,如果我移动MyPad映射到公共接口,我已经使我所有的测试通过了,但是这当然是作弊,因为我正在尝试改进我的现代C++技能,我认为有一些原则,我还没有用UnjyQupTR移动。
所以我的问题是:如何在私有std::map中使用std::unique\u ptr?

您应该返回一个引用

auto & operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; } 
auto&operator[](键类型和键){返回我的映射[std::forward(键)];}

您应该返回一个引用

auto & operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; } 
auto&operator[](键类型和键){返回我的映射[std::forward(键)];}

@LogicStuff:不能仅凭标题就复制那一个。@LogicStuff:不能仅凭标题就复制那一个。@LogicStuff:但这不也会影响唯一的\u ptr的已删除默认构造函数吗?
唯一的\u ptr
的@einpoklum默认构造函数不会被删除,只有复制构造函数和复制赋值操作符被删除。它将用nullptr初始化。这很有效,很好。请你详细说明一下,以便我能更好地理解?在我看来,我的地图上调用的操作符[]已经返回了一个引用,我希望“auto”已经是一个引用。我遗漏了什么?@Francesco
auto
类型推断规则将删除引用并生成
std::unique\u ptr
,正是
decltype(auto)
将生成与您预期完全相同的引用类型。我想这有点违反直觉。@Francesco我是说
decltype(auto)操作符[](
。已经有几个问题在问了。但是这不会也影响到唯一的\u ptr的已删除默认构造函数吗?@einpoklum
唯一的\u ptr的默认构造函数未被删除,只有复制构造函数和复制赋值操作符被删除。它将用nullptr初始化。很好。您能详细说明一下吗o我能更好地理解吗?在我的想法中,我的映射上调用的操作符[]已经返回了一个引用,我希望“auto”已经是一个引用。我缺少什么?@Francesco
auto
类型推断规则将删除一个引用并生成
std::unique\u ptr
,它是
decltype(auto)
这将产生与您所期望的完全相同的引用类型。我想这是违反直觉的。@Francesco我的意思是
decltype(auto)operator[](
),已经有几个问题在问这个了。