Ответ 1
Это позволяет мне сделать это:
std::iterator_traits<I>::value_type val = *iter;
val += 5;
doSomething(val);
Но что сложнее, если value_type
является const, потому что мне нужно использовать remove_const
.
Если я не хочу получать изменяемое значение, то не имеет значения, является ли value_type
const или нет:
const std::iterator_traits<I>::value_type cval = *iter;
std::iterator_traits<I>::reference ref = *iter;
Обе эти работы предназначены для константных итераторов и неконстантных итераторов, и оба работают независимо от того, является ли value_type
const или нет, но первый пример работает только для константных итераторов, если их value_type
не const.
Как вы должны взять базовый const правильный тип итератора?
Итератор не обязательно имеет свой собственный базовый тип, итератор обычно ссылается на некоторый диапазон или некоторую коллекцию, и эта коллекция является базовым типом. например, std::list<int>::const_iterator
value_type
std::list<int>::value_type
, который int
не const int
.
Вы не обязательно хотите знать, что такое базовый тип, скорее всего, вы хотите узнать, что такое результат *iter
, и что говорит iterator_traits<I>::reference
.