【问题标题】:understanding the type of dereference - const_iterator了解取消引用的类型 - const_iterator
【发布时间】:2019-12-26 02:12:15
【问题描述】:

我有这个声明:

list<string*>::const_iterator iter;

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

我读到cost_iterator 返回参考。 一方面,列表包含string*,而迭代器指向这些。 另一方面,它是const_iterator,所以它指向的值应该是const,它的行为就好像列表中的数据是const?尽管它不是真的? 不知道我错过了什么以及正确的答案是什么。

【问题讨论】:

  • 类型应该是string const * - `指向非常量数据的常量指针

标签: c++ types dereference const-iterator


【解决方案1】:

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

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

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

您可以阅读 std::list&lt;T&gt; 的定义,但它对迭代器的行为并不十分清楚 - 它的工作原理如下:

  • std::list&lt;T&gt;::value_typeT 相同

    • 所以std::list&lt;string*&gt;::value_typestring*
  • std::list&lt;T&gt;::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 &amp; 的方式。

【讨论】:

  • 说得好。我的 Stroustrup 4ed 说“const_iterator 表现得像 const value_type
【解决方案2】:

std::list&lt;T&gt;::const_iterator::operator* 返回一个const T&amp;。由于您的列表存储了string*,这意味着您将获得对string * const 的引用,因为const 适用于T,而不是T 指向的对象(如果它是一个指针)。

【讨论】:

猜你喜欢
  • 2013-11-09
  • 2020-09-17
  • 2016-01-25
  • 2019-02-28
  • 1970-01-01
  • 2023-03-06
  • 2017-02-10
  • 2016-04-18
  • 2011-07-20
相关资源
最近更新 更多