const_iterator和恒常性const_iterator::value_type

const_iterator and constness of const_iterator::value_type

本文关键字:const iterator value type 常性      更新时间:2023-10-16

为什么在STL中

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

与 的类型相同

std::iterator_traits<T*>::value_type

为什么会这样设计?第一个不应该是常量T,第二个只有T吗?您应该如何采用迭代器的基础常量正确类型?我知道你可以编写自己的模板类和专业化,并从中获取

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

但是不应该有一个成员类型定义来持有它吗?

Constness 对于值类型无关紧要,因为值意味着副本。 然而,std::iterator_traits<const T*>::reference是一个const T&

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

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

无论迭代器是const T *还是T *,它都可以正常工作。

它允许我这样做:

std::iterator_traits<I>::value_type val = *iter;
val += 5;
doSomething(val);

但如果value_type是常量,那就更难了,因为我需要使用remove_const

如果我不想获得可修改的值,那么value_type是否是常量并不重要:

const std::iterator_traits<I>::value_type cval = *iter;
std::iterator_traits<I>::reference        ref  = *iter;
这两种方法都适用于常量迭代器

和非常量迭代器,并且无论value_type是否是常量都有效,但第一个示例仅适用于常量迭代器,如果它们的value_type是非常量。

您应该如何采用迭代器的基础常量正确类型?

迭代器

不一定有自己的基础类型,迭代器通常引用某个范围或某个集合,而该集合是具有基础类型的集合。 例如std::list<int>::const_iteratorvalue_typestd::list<int>::value_type,这int不是const int

无论如何,您不一定想知道底层类型是什么,您更有可能想知道*iter的结果是什么,这就是iterator_traits<I>::reference告诉您的。