了解取消引用的类型 - const_iterator

understanding the type of dereference - const_iterator

我有这个声明:

list<string*>::const_iterator iter;

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

我阅读了 cost_iterator returns 参考资料。 一方面,列表包含 string* 并且迭代器指向这些。 另一方面它是 const_iterator 所以它指向的值应该是 const 并且它就像列表中的数据是 const 一样?尽管不是真的? 不确定我错过了什么以及正确答案是什么。

std::list<T>::const_iterator::operator*returns一个const T&。由于您的列表存储 string*,这意味着您将获得对 string * const 的引用,因为 const 适用于 T,而不是 T 指向的内容如果它是一个指针。

一般的答案是const T &,我更喜欢写T const &,因为它在下一段中组成正确。

对于 T=string*,我们得到 string * const &,或 对字符串常量指针的引用

这意味着您不能通过将列表元素指向不同的字符串来改变列表元素(通过 const_iterator),但是您 可以 间接改变列表改变它指向的字符串。

您可以阅读 std::list<T> 的定义,但关于迭代器的行为并没有那么清楚 - 它的结果如下:

  • std::list<T>::value_type 等同于 T

    • 所以 std::list<string*>::value_typestring*
  • std::list<T>::const_iterator 模型 const LegacyBidirectionalIterator

  • LegacyBidirectionalIterator 是一个 LegacyForwardIterator which must satisfy LegacyInputIterator

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

  • 最后,我们跳过了 LegacyForwardIterator

    • The type std::iterator_traits::reference must be exactly

      ... const T& otherwise (It is constant),

    (where T is the type denoted by std::iterator_traits::value_type)

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