value_type для карты с указателями в качестве ключа - PullRequest
11 голосов
/ 17 октября 2011

Насколько я знаю, C ++ определяет map<a,b>::value_type как pair<const a,b>

Что произойдет, если я использую тип указателя в качестве типа ключа в карте, т. Е. Это

std::map<const char*,int>::value_type::first_type = const char*

как и следовало ожидать из определения выше или

std::map<const char*,int>::value_type::first_type = const char* const

, как было бы более логичным (поскольку в противном случае мне было бы разрешено изменять значение ключа из итератора карты)?

Ответы [ 3 ]

11 голосов
/ 17 октября 2011

Ваши рассуждения верны, value_type::first будет char const * const.

Существует распространенная путаница в мысли, что const T, когда T - это type *, это const type *, но это не так.В отличие от макросов, typedef s не являются ни текстовыми подстановками, ни аргументами шаблонов.Когда вы делаете const T, если T является typedef или аргументом шаблона, вы добавляете const к типу в целом.

Это одна из причин, почему мне нравится писатьmy const s справа от типа, так как это вызывает меньше путаницы: T const *, добавьте дополнительный const, получите T const * const.

2 голосов
/ 17 октября 2011

Если a равно const char*, то const a действительно const char* const.

0 голосов
/ 17 октября 2011

Вы правы в своей оценке, но вы должны быть очень осторожны с этим подходом по двум причинам:

  1. Вы должны предоставить пользовательский предикат сравнения, который выполняет правильное упорядочение const char * (например, используя вариант strcmp, который возвращает true только если key1
  2. Вы должны учитывать время жизни ключей на вашей карте и то, как они будут освобождены прикарта уничтожена.
...