获取对unordered_map operator []的引用返回值

0 c++ dictionary stl rvalue

我想unordered_map在一个步骤中插入新元素并更新它们的值(如果它们已经存在).我正在使用operator[]重载执行此操作,文档说这将返回对地图的值类型的引用.

unordered_map<int, size_t> map;
int &element = map[-3];
element++;
Run Code Online (Sandbox Code Playgroud)

这不编译.但是,以下操作会按照我的预期执行(将值初始化为1并在存在时将其递增):

unordered_map<int, size_t> map;
map[-3]++;
Run Code Online (Sandbox Code Playgroud)

以下也编译,但没有做我期望的(这是我最初写的,这导致了一个错误):

unordered_map<int, size_t> map;
auto element = map[-3];
element++;
Run Code Online (Sandbox Code Playgroud)

编译器似乎表明rvalue map[-3]是一个int,而不是一个int&.

我看了看这个答案:map operator []的返回值(以及"at"方法)

但在这种情况下,LHS类型被强制为一个值.我如何获得[可变]参考?

raf*_*x07 6

你的地图有什么价值?int还是size_t?

    unordered_map<int, size_t> map;
    size_t &element = map[-3]; // now it works
    element++;
Run Code Online (Sandbox Code Playgroud)

auto在完成类型推导时丢弃引用,如果要修改map中的值,则需要使用decltype(auto)auto&(更可读)

   unordered_map<int, size_t> map;
   decltype(auto) element = map[-3];
   element++; // now it works
Run Code Online (Sandbox Code Playgroud)

  • 不是`decltype(auto)`有点矫枉过正吗?`auto&`或`auto &&`也可以运行,也更容易理解 (3认同)
  • 当然你的意思是"价值"而不是"关键";) (2认同)