const_iterator和const_iterator :: value_type的constness

时间:2012-10-10 12:31:09

标签: c++ iterator const-iterator iterator-traits

为什么在STL

std::iterator_traits<const T*>::value_type

的类型相同
std::iterator_traits<T*>::value_type

为什么它的设计是这样的?首先不应该是 const T 而第二个 T ?你应该如何采用底层const正确类型的迭代器?我知道你可以编写自己的模板类和专业化,并从

获取
    std::iterator_traits<const T*>::pointer

但是不应该有成员typedef来保存它吗?

2 个答案:

答案 0 :(得分:14)

Constness与值类型无关,因为值意味着副本。 std::iterator_traits<const T*>::reference只是const T&

例如,您可以编写此函数:

template <class Iterator>
typename std::iterator_traits<Iterator>::value_type getValue(Iterator i)
{
  return *i;
}

无论Iterator是const T *还是T *,它都能正常运行。

答案 1 :(得分:11)

它允许我这样做:

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迭代器和非const迭代器,并且无论value_type是否为const都可以工作,但第一个示例仅适用于const迭代器,如果它们的value_type是非const的

  

你应该如何采用迭代器的底层const正确类型?

迭代器不一定具有自己的底层类型,迭代器通常引用某个范围或某个集合,而该集合具有底层类型。例如std::list<int>::const_iterator的{​​{1}}是value_typestd::list<int>::value_type不是int

你不一定想知道底层类型是什么,你更有可能想知道const int的结果是什么,这就是*iter告诉你的。