C++ 常量迭代器与常量迭代器的常量::值类型
为什么在STL中C++ 常量迭代器与常量迭代器的常量::值类型,c++,iterator,const-iterator,iterator-traits,C++,Iterator,Const Iterator,Iterator Traits,为什么在STL中 std::iterator_traits<const T*>::value_type std::迭代器特征::值类型 类型与 std::iterator_traits<T*>::value_type std::迭代器特征::值类型 为什么设计成这样?第一个不应该是常数t,第二个不应该是t?您应该如何获取迭代器的基本const-correct类型?我知道您可以编写自己的模板类和专门化,并从 std::iterator_traits<c
std::iterator_traits<const T*>::value_type
std::迭代器特征::值类型
类型与
std::iterator_traits<T*>::value_type
std::迭代器特征::值类型
为什么设计成这样?第一个不应该是常数t,第二个不应该是t?您应该如何获取迭代器的基本const-correct类型?我知道您可以编写自己的模板类和专门化,并从
std::iterator_traits<const T*>::pointer
std::iterator\u traits::pointer
但是是否应该有一个成员typedef来保存它呢?常量对于值类型并不重要,因为值意味着一个副本。然而,
std::iterator\u traits::reference
是一个常量&
例如,您可以编写以下函数:
template <class Iterator>
typename std::iterator_traits<Iterator>::value_type getValue(Iterator i)
{
return *i;
}
模板
typename std::迭代器\特征::值\类型getValue(迭代器i)
{
返回*i;
}
无论迭代器是
const T*
还是T*
,它都能很好地工作。它允许我这样做:
std::iterator_traits<I>::value_type val = *iter;
val += 5;
doSomething(val);
这两种方法都适用于常量迭代器和非常量迭代器,并且无论value\u type
是否为常量都适用,但第一个示例仅适用于常量迭代器,前提是它们的value\u type
为非常量
您应该如何获取迭代器的基本const-correct类型
迭代器不一定有自己的基础类型,迭代器通常指某个范围或某个集合,而该集合就是具有基础类型的集合。e、 gstd::list::const\u迭代器的value\u类型
是std::list::value\u类型
,它是int
而不是const int
你不一定想知道底层类型是什么,你更可能想知道*iter
的结果是什么,这就是迭代器traits::reference
告诉你的。你能解释一下“采用底层const-correct类型”吗?你说的“take”是什么意思?我的意思是,如果我想从迭代器中获取“const T”,或者从迭代器中获取成员typedef,当迭代器指向一个const类型时。我明白了。不过,我不确定什么样的用例才是好用例。您可以添加一个示例吗?假设您想要获取类型迭代器\u traits::value\u type::some\u member\u const\u dependent\u type,如果它是常量迭代器,您希望它是常量。T的常量不影响T::type,因此,让迭代器_traits::value_type为const没有帮助。如果value_type
为const t
:)@JonathanWakely:True,该函数也可以正常工作。“我喜欢你的例子,”乔纳森·韦克利:但这有意义吗?与const
返回类型相关的限制。@MatthieuM。这对于类类型可能是有意义的,而不知道您不能说的value\u type
是什么。重点是它是有效的。+1:这是一个很好的例子,说明为什么它不是常数是好的。我想是这样的,因为它更有用,正如你在例子中指出的。引用:“迭代器不一定有自己的底层类型,迭代器通常指的是某个范围或某个集合,而该集合就是具有底层类型的集合。”“const t*”可以指类型为“const t”的迭代器集合或类型为“t”的集合的常量迭代器“。没有办法区分“std::iterator_traits”是什么意思,所以“更好”的做法是假设它是一个常量迭代器。最好不要假设这两种情况中的任何一种,并且有一个适用于这两种情况的一致模型。我的意思是,std::iterator_traits原样,假设“const T*”是类型“T”集合的常量迭代器。
const std::iterator_traits<I>::value_type cval = *iter;
std::iterator_traits<I>::reference ref = *iter;