Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量迭代器与常量迭代器的常量::值类型_C++_Iterator_Const Iterator_Iterator Traits - Fatal编程技术网

C++ 常量迭代器与常量迭代器的常量::值类型

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

为什么在STL中

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、 g
std::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;