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