Const_iterator и константа const_iterator:: value_type - программирование
Подтвердить что ты не робот

Const_iterator и константа const_iterator:: value_type

Почему в STL

std::iterator_traits<const T*>::value_type

- это тот же тип, что и

std::iterator_traits<T*>::value_type

Почему он так устроен? Не должен ли первый быть const T, а второй - только T? Как вы должны взять базовый const правильный тип итератора? Я знаю, что вы можете написать свой собственный класс шаблонов и специализацию и получить его от

    std::iterator_traits<const T*>::pointer

но не должно быть члена typedef, который его удерживает?

4b9b3361

Ответ 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.

Ответ 2

Константа не имеет значения для типа значения, так как значение подразумевает копию. std::iterator_traits<const T*>::reference является const T&.

Например, вы можете написать эту функцию:

template <class Iterator>
typename std::iterator_traits<Iterator>::value_type getValue(Iterator i)
{
  return *i;
}

и он отлично работает, является ли Iterator const T * или T *.