Я заметил, что std :: map :: const_iterator утечки не-const ссылки на value_type:
#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
Ожидается ли это? Зачем? Единственный способ кодирования const-защиты std :: map состоит в том, чтобы обернуть его в другой класс?
Эта строка:
создает
const reference
вstd::map<int,int>::iterator
с именемit
, поэтому вы не можете изменять или iterator, на который он ссылается, но может изменять данные, на которые он указывает (как итератор). Он похож на константный указатель vs указатель на данные const. Используйтеit
, чтобы получитьm
с автоматическим выводом типа (он не должен быть ссылкой на константу) или дать ему явный тип:тогда вы не можете изменять данные через этот итератор.
m
как одного из решений вашей проблемы