获取对运算符 [] 返回值unordered_map引用

Acquiring a reference to unordered_map operator[] return value

本文关键字:unordered map 引用 返回值 运算符 获取      更新时间:2023-10-16

我想在unordered_map中插入新元素并更新它们的值(如果它们已经存在),所有这些都在一个步骤中完成。我正在使用operator[]重载来执行此操作,文档说它返回对映射值类型的引用。

unordered_map<int, size_t> map;
int &element = map[-3];
element++;

这不会编译。但是,以下内容确实如此,并按我的预期执行(将值初始化为 1 并递增它(如果存在):

unordered_map<int, size_t> map;
map[-3]++;

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

unordered_map<int, size_t> map;
auto element = map[-3];
element++;

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

我看了这个答案:map运算符[](和"at"方法)的返回值

但在这种情况下,LHS 类型被强制为值。如何取回 [可变] 引用?

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

    unordered_map<int, size_t> map;
    size_t &element = map[-3]; // now it works
    element++;

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

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