C++ 分配给映射迭代器会导致值更改,而不是引用

C++ 分配给映射迭代器会导致值更改,而不是引用,c++,standard-library,C++,Standard Library,我不明白为什么在std::map中分配给迭代器->秒会修改映射中的值 #include <typeinfo> #include <map> #include <iostream> int main() { std::map<int, int> lol; lol[2] = 33; auto it = lol.find(2); it->second = 91; // This changes the map's value

我不明白为什么在std::map中分配给迭代器->秒会修改映射中的值

#include <typeinfo>
#include <map>
#include <iostream>

int main() {
  std::map<int, int> lol;
  lol[2] = 33;

  auto it = lol.find(2);

  it->second = 91; // This changes the map's value

  std::cout << typeid(it->second).name(); // This just shows 'int', not a reference

  std::cout << lol[2]; // 91

  return 0;
}
#包括
#包括
#包括
int main(){
映射lol;
lol[2]=33;
auto it=lol.find(2);
it->second=91;//这会更改贴图的值
std::cout second).name();//这只是显示“int”,而不是引用
标准::cout
it->second
不就是一个int而不是一个引用吗

是的,它只是一个
int
*它给你一个
std::pair&
,一个对
映射中节点实际值的引用。但是对
second
的成员访问实际上只是一个
int
。trait“是一个引用”,trait“可分配给”不等效-您可以分配给非引用,也有一些引用无法分配。
it->second
为您提供类型为
int
的左值,您可以通过以下方式分配:

int i = 4;
i = 5; // i is not a reference, but you can assign it here

这就是说,
typeid()
无论如何都不会给你一个引用类型,因为引用和简历资格从类型分析中删除。另请参阅


也就是说,你可能想看的是
decltype((it->second))
(是的,双倍括号,双倍乐趣)。事实上,这会给你
int&
,因为这个表达式是
int

Typeid
类型的左值,它不会告诉你它是否是一个引用。@JakeFreeman它甚至不能用这里的技术@Barry确实不行。编辑它太晚了,我会删除它。明白了,所以我正在取消对节点的引用,然后修改它如果直接对值进行赋值,对吗?