Тема: iterator_category for references to pointer
Всім привіт.
Ітератор - тип даних, призначений для ітерування по елементах колекцій, і доступу до самих елементів.
Як визначити: чи є тип даних ітератором?
Найпростіший спосіб, це подивитися: чи визначена для типу категорія ітераторів: iterator_traits<>::iterator_category
Якщо визначена - це ітератор.
У свою чергу, iterator_traits керується вимогами до так званих легальних Ітераторів.
Тепер питання: чому шаблон iterator_traits<>::iterator_category не визначений для посилань на вказівники?
using ptr = std::iterator_traits<int*>::iterator_category; // ok
using ref_ptr = std::iterator_traits<int*&>::iterator_category; // fails
Посилання на звичайний покажчик на всі 100% відповідає вимогам до "легальних Ітераторів".
template<class T> void dtor(T v)
{
v.~t();
}
int main()
{
int v = 0;
int *p = &v;
int *&r1 = p;
int *&r2 = p; // CopyConstructible
r2 = p; // CopyAssignable
dtor(r2); // Destructible
std::swap(r2, r1); // Swappable
++r2; // increment
*r2; // dereference
}