了解取消引用的类型-const_iterator

时间:2019-08-20 19:58:50

标签: c++ types dereference const-iterator

我有这个声明:

list<string*>::const_iterator iter;

我试图了解*iter的类型是:string*const string*还是其他类型。

我读到cost_iterator返回引用。 一方面,列表包含string*,迭代器指向它们。 另一方面,它是const_iterator,所以它指向的值应该是const,它的作用就像列表中的数据是const一样?尽管不是真的吗? 不确定我错过了什么,正确的答案是什么。

2 个答案:

答案 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_typeT

    • 所以std::list<string*>::value_typestring*
  • std::list<T>::const_iteratorconst LegacyBidirectionalIterator

  • 建模
  • LegacyBidirectionalIterator是一个LegacyForwardIterator,必须满足LegacyInputIterator

  • LegacyInputIterator必须支持表达式*i返回类型reference

  • 最后,我们从LegacyForwardIterator中跳过了

      
        
    • 类型std :: iterator_traits :: reference必须准确

           

      ...   const T&否则(它是常数),

    •   
         

    (其中T是std :: iterator_traits :: value_type表示的类型)

    这就是我们从名为reference的类型到开始使用的const T &的方式。