Value_type для карты с указателями в качестве ключа

Для чего я знаю, С++ определяет 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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

  • Вы должны предоставить собственный предикат компаратора, который выполняет правильный порядок const char * (например, используя вариант strcmp, который возвращает true, если key1 < key2). Если вы этого не сделаете, ваши строки будут упорядочены по значениям указателя, что почти всегда не так, как вы хотите.
  • Вы должны учитывать время жизни ключей на вашей карте и то, как они будут освобождены при уничтожении карты.