18

为什么在 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 持有它吗?

4

2 回答 2

16

常量与值类型无关,因为值意味着副本。然而,这std::iterator_traits<const T*>::reference是一个const T&

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

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

无论 Iterator 是 aconst T *还是 a ,它都可以正常工作T *

于 2012-10-10T12:37:14.953 回答
13

它允许我这样做:

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告诉您的。

于 2012-10-10T14:01:22.700 回答