std :: map :: const_iterator пропускает неконстантную ссылку на значение? - PullRequest
0 голосов
/ 05 июня 2018

Я заметил, что std :: map :: const_iterator пропускает неконстантную ссылку на тип_значения:

#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;
}

output

$ g++ test.cc && ./a.out 
1 1
1 3

Ожидается ли это?Зачем?Единственный способ кодифицировать const-защиту std :: map - это обернуть его в другой класс?

1 Ответ

0 голосов
/ 05 июня 2018

Эта строка:

const auto &it = foo.find(1);

создает const reference до std::map<int,int>::iterator с именем it, поэтому вы не можете изменить it сам или итератор, на который он ссылается, но можете изменить данные, на которые он указывает (как итератор).Это похоже на постоянный указатель против указателя на постоянные данные.Используйте m, чтобы получить std::map<int,int>::const_iterator с автоматическим выводом типа (это не обязательно должна быть константная ссылка) или дать ему явный тип:

std::map<int,int>::const_iterator it = foo.find(1);

, тогда вы не сможете изменять данные через этот итератор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...