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