它允许我这样做:
std::iterator_traits<I>::value_type val = *iter;
val += 5;
doSomething(val);
但如果value_type是 const,那就更难了,因为我需要使用remove_const.
如果我不想获得可修改的值,那么是否value_type为 const 并不重要:
const std::iterator_traits<I>::value_type cval = *iter;
std::iterator_traits<I>::reference ref = *iter;
这两种方法都适用于 const 迭代器和非常量迭代器,无论是否value_type为 const 都适用,但第一个示例仅适用于value_type非常量的 const 迭代器。
您应该如何采用迭代器的底层 const 正确类型?
迭代器不一定有它自己的底层类型,迭代器通常指的是某个范围或某个集合,而该集合就是具有底层类型的集合。例如std::list<int>::const_iterator's value_typeis std::list<int>::value_type, which is intnot const int。
无论如何,您不一定想知道底层类型是什么,您更有可能想知道结果*iter是什么,这就是iterator_traits<I>::reference告诉您的。