问题描述
#include <iostream>
#include <map>
using namespace std;
int main()
{
int number = 10;
map<int*,int> intmap;
intmap.insert(pair<int*,int>(&number,1));
for (auto const & x : intmap)
{
(*x.first)++;
}
for (auto const & x : intmap)
{
cout << (*x.first) << "::" << x.second; //prints 11::1
}
return 0;
}
如果您想处理原始项目,请选择 auto const &x 不会修改它们。
但是在上面的程序中,我可以修改它。看起来 for 循环中的 x 是常量指针而不是指向常量的指针。
解决方法
您不是在修改地图或地图元素。您正在修改指针对象,没有什么可以阻止您这样做(除了更改地图类型)。
x
的类型是 const std::pair<int* const,int>&
,或者是对 const 对的引用。请注意,该对的第一个元素是一个常量指针,但它不是指向一个常量值。
有了这个,你就不能修改任何一对元素(x.first++
和 x.second++
都会失败)。
然而,由于 x.first
是一个指向非常量 int 的 const 指针,*x.first
只是一个普通的 int&
,这里没有 const,你可以增加它。
如果您想防止这种情况发生,您可以将映射键类型更改为 const int*
,也就是。 指向 const int 的指针。
map<const int*,int> intmap;
另请注意,即使使用非常量引用,您也无法修改键(或成对的第一个值):
for (auto & x : intmap)
{
x.first++; //fails
}
,
类似情况:
const int*
常量指针不能被修改,但是你可以用它来修改它所指向的东西。只有指向常量 int
的指针 for i in sorted(indexes,reverse=True):
list.pop(i)
才能阻止这种情况发生。