C++ 获取对无序映射运算符[]返回值的引用
我想在一个C++ 获取对无序映射运算符[]返回值的引用,c++,dictionary,stl,rvalue,C++,Dictionary,Stl,Rvalue,我想在一个无序的地图中插入新元素,如果它们已经存在,则更新它们的值,这一切都在一个步骤中完成。我使用操作符[]重载来执行此操作,文档称该重载返回对映射值类型的引用 unordered_map<int, size_t> map; int &element = map[-3]; element++; 无序地图; int&element=map[-3]; 元素++; 这是不可编译的。但是,以下操作会执行,并按预期执行(将值初始化为1,如果存在则递增): 无序地图; 映射[-3]
无序的
地图中插入新元素,如果它们已经存在,则更新它们的值,这一切都在一个步骤中完成。我使用操作符[]
重载来执行此操作,文档称该重载返回对映射值类型的引用
unordered_map<int, size_t> map;
int &element = map[-3];
element++;
无序地图;
int&element=map[-3];
元素++;
这是不可编译的。但是,以下操作会执行,并按预期执行(将值初始化为1,如果存在则递增):
无序地图;
映射[-3]++;
以下内容也进行了编译,但没有达到我的预期(这是我最初编写的,导致了一个bug):
无序地图;
自动元素=映射[-3];
元素++;
编译器似乎指示右值映射[-3]
是int
,而不是int&
我看了一下这个答案:
但在这种情况下,LHS类型被强制为一个值。如何获取[可变]引用?地图的价值是什么?整数还是大小
unordered_map<int, size_t> map;
size_t &element = map[-3]; // now it works
element++;
尝试
auto&element=map[-3]
您的意思肯定是值
而不是键
;)啊哈,是的,值是size\t
!感谢您提供的decltype
提示。尽管@Sailesh D上面的评论可能更干净了,但是decltype(auto)
不是有点过分了吗auto&
或auto&
也会起作用,而且更容易理解,对礼仪不太确定,但如果您包括auto&
我可能会接受答案(?)@JVApen是的,谢谢您的建议,我也在答案中添加了auto&。
unordered_map<int, size_t> map;
auto element = map[-3];
element++;
unordered_map<int, size_t> map;
size_t &element = map[-3]; // now it works
element++;
unordered_map<int, size_t> map;
decltype(auto) element = map[-3];
element++; // now it works