Я считаю относительно новым, что класс итератора должен иметь следующие теги в верхней части класса:
using iterator_category = std::bidirectional_iterator_tag;
using value_type = T;
using difference_type = int;
using pointer = T*;
using reference = T&;
Почему это необходимо и что они делают за кулисами? (если что)