我有这个声明:
list<string*>::const_iterator iter;
我试图了解*iter
的类型是:string*
,const string*
还是其他类型。
我读到cost_iterator
返回引用。
一方面,列表包含string*
,迭代器指向它们。
另一方面,它是const_iterator
,所以它指向的值应该是const
,它的作用就像列表中的数据是const
一样?尽管不是真的吗?
不确定我错过了什么,正确的答案是什么。
答案 0 :(得分:5)
std::list<T>::const_iterator::operator*
返回一个const T&
。由于您的列表存储了string*
,这意味着您将获得对string * const
的引用,因为const
适用于T
,而不是T
指向的内容如果它是指针。
答案 1 :(得分:3)
通常的答案是const T &
,我更喜欢写T const &
,因为它在下一段中正确地构成了。
对于T=string*
,我们得到string * const &
或对字符串的常量指针的引用。
这意味着您不能通过将列表元素指向另一个字符串来对其进行变异(通过const_iterator),但是您可以 通过更改其所指向的字符串来间接对列表进行变异。 / p>
您可以阅读std::list<T>
的定义,但是关于迭代器的行为尚不清楚,它的工作原理如下:
std::list<T>::value_type
与T
std::list<string*>::value_type
是string*
。 std::list<T>::const_iterator
为const
LegacyBidirectionalIterator
LegacyBidirectionalIterator是一个LegacyForwardIterator,必须满足LegacyInputIterator
LegacyInputIterator必须支持表达式*i
返回类型reference
最后,我们从LegacyForwardIterator中跳过了
类型std :: iterator_traits :: reference必须准确
... const T&否则(它是常数),
(其中T是std :: iterator_traits :: value_type表示的类型)
这就是我们从名为reference
的类型到开始使用的const T &
的方式。