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). Если вы этого не сделаете, ваши строки будут упорядочены по значениям указателя, что почти всегда не так, как вы хотите.
- Вы должны учитывать время жизни ключей на вашей карте и то, как они будут освобождены при уничтожении карты.