В чем разница между const_iterator <T>и итератором <const T>? - PullRequest
8 голосов
/ 17 июня 2019

Допустим, я реализую коллекцию, скажем что-то вроде std::vector.Мне нужно реализовать iterator и const_iterator, но как только я сделал iterator, можно ли const_iterator просто реализовать как iterator<const T> (где T - это тип, содержащийся в коллекции)?

Должна быть какая-то причина, почему это не работает, потому что есть миллион вопросов о том, как повторно использовать код при реализации iterator и const_iterator, но ни один из них не говорит "просто используйте const T в качестве типа».

1 Ответ

4 голосов
/ 17 июня 2019

std::iterator_traits<Iter>::value_type должно быть T для const_iterator<T>, но const T 1 для iterator<const T>.Если вы используете iterator<const T> в качестве const_iterator<T>, вам придется нарушить одно из этих предположений.

Можно использовать общий шаблон для обоих итераторов, если константа типа значения является отдельным шаблоном.аргумент из постоянства итератора.Что-то вроде:

template<class T>
struct container
{
    template<class ItPtr>
    struct iterator_common
    {
        using value_type = T;
        using pointer = ItPtr;
        using reference = std::remove_pointer_t<ItPtr>&;
        // ...
    };

    using iterator = iterator_common<T*>;
    using const_iterator = iterator_common<const T*>;
    // ...
};

1 До C ++ 20, в котором должно быть std::remove_cv_t<const T>, что составляет T.Таким образом, это не будет проблемой для вашего предложения в будущей стандартной версии.

...