++ 11 std::remove_reference<decltype(*a)>::type, auto.
++ 03 :
template <typename T> void value_swap(T & a, T & b) {
T t = a;
a = b;
b = t;
}
template <typename I> void iterator_swap(I a, I b) {
value_swap(*a, *b);
}
( ) std::iterator_traits<ITERATOR>::value_type. , - , iterator_traits iterator_traits .
, decltype; , GCC typeof. , .
, std::iter_swap.