我发现std :: map :: const_iterator泄漏了对value_type的非const引用:
#include <map>
#include <stdio.h>
int main (int argc, char *argv[])
{
std::map<int,int> foo = {{1,1},{4,2}};
const auto &m = foo;
const auto &it = foo.find(1);
printf("%d %d\n", it->first, it->second);
int &i = it->second;
i = 3;
auto &one = foo.at(1);
printf("%d %d\n", 1, one);
return 0;
}
输出
$ g++ test.cc && ./a.out
1 1
1 3
这是预期的吗?为什么?编写std :: map的const-protection的唯一方法是将它包装在另一个类中吗?
答案 0 :(得分:7)
这一行:
const auto &it = foo.find(1);
创建名为const reference
的{{1}}到std::map<int,int>::iterator
,因此您无法修改it
本身或它引用的迭代器,但可以修改它指向的数据(作为迭代器)。它类似于常量指针与指向const数据的指针。使用it
获取m
类型自动扣除(它不必是const引用)或给它显式类型:
std::map<int,int>::const_iterator
然后你无法通过迭代器修改数据。