std :: map :: const_iterator泄漏非const引用值?

时间:2018-06-05 17:20:48

标签: c++ c++11 stdmap

我发现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的唯一方法是将它包装在另一个类中吗?

1 个答案:

答案 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

然后你无法通过迭代器修改数据。