아직은 포인터 문제가 남아 있다. iterator_traits 템플릿은 어떻게 알고리즘이 반복자뿐 아니라 포인터도 사용할 수 있게 했을까? iterator_traits 템플릿에는 T*과 const T* 타입에 대한 특수화가 정의되어 있다. 예를 들어 템플릿 타입 인수가 포인터 타입 T*일 때 특수화는 다음과 같이 정의되어 있다.
template<class T> struct iterator_traits<T*> { typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; typedef random_access_iterator_tag iterator_category; };
템플릿 타입 인수가 포인터 타입일 때 별칭 이름에 해당하는 타입을 정의한 것이다. T* 타입의 포인터의 경우 value_type 별칭은 항상 T가 된다. Box* 타입의 포인터를 my_swap()에 인수로 사용한다면 value_type 별칭은 Box가 되고, tmp도 Box 타입이 된다. 랜덤 액세스 반복자 카테고리에 필요한 모든 연산은 포인터에 적용할 수 있으므로 iterator_category 별칭은 항상 포인터에 대해 std::random_access_iterator_tag와 같은 표현이 된다. 따라서 iterator_traits 템플릿이 동작하는 방식은 템플릿 타입 인수가 포인터이냐, 반복자 클래스 타입이냐에 따라 다르다. 템플릿 타입 인수가 포인터이면 포인터를 위한 iterator_traits의 특수화가 선택될 것이고, 그렇지 않은 경우엔 표준 템플릿 정의가 선택될 것이다.