为什么在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_iterator
的value_type
是std::list<int>::value_type
,这int
不是const int
。
无论如何,您不一定想知道底层类型是什么,您更有可能想知道*iter
的结果是什么,这就是iterator_traits<I>::reference
告诉您的。