【问题标题】:Non-const reference type with STL-conforming const Iterator?具有符合 STL 的 const Iterator 的非常量引用类型?
【发布时间】:2014-06-06 00:33:01
【问题描述】:

我正在编写一个基本上为其他数据提供灵活接口的类。我想使用符合 STL 的迭代器来迭代元素,并且使用 boost::iterator_facade 走在正确的轨道上,但我有一个关于一致性的问题,我似乎无法找到官方答案。

我必须为 STL 一致性提供一个 const 迭代器吗?

我将std::shared_ptr<T>& 用于迭代器提供的非常量取消引用类型。如果我确实提供了 const 迭代器,是否可以为我的取消引用类型提供 std::shared_ptr<T>& 而不是 std::shared_ptr<const T>&

我觉得这两个问题的答案是否定的,但我无法找到证实/证实这些怀疑的官方来源。我认为第二个问题更多的是语义问题。

【问题讨论】:

  • 您确定不想从迭代器返回引用吗?因为那时你最多有一个输入迭代器......
  • @Deduplicator 我认为返回对shared_ptr 的引用让我觉得很不寻常,但我明白你的意思。我将不得不重新考虑这个界面。
  • 您的“其他数据”是否可写?如果没有,则仅提供 const 迭代器。
  • @Deduplicator 它是可写的。关于这个“其他数据”的特别之处是我在迭代时生成元素视图T。这就是我为生成的元素提供 shared_ptr 的原因。不过,为了与问题的范围保持一致,我将编辑问题并假设引用类型。
  • 这些 shared_ptr 是每个返回的东西唯一的,还是同一个容器中的所有共享点都相同?如果是后者,就把shared_ptr全部去掉。

标签: c++ c++11 boost stl iterator


【解决方案1】:

const 应该达到多远由您决定。

标准方法是,只需在const_iterator 返回的元素(可能通过引用)上打一个const。这也是标准库所做的。
所以,如果你的标准迭代器的返回类型是std::shared_ptr<T>&,那么你的常量迭代器的返回类型应该是const std::shared_ptr<T>&

顺便说一句:您是否阅读过描述迭代器要求的标准部分,例如:

Random Access -> Bidirectional -> Forward -> Input
                                             Output

完整的容器接口提供 const 迭代器和非常量迭代器。
如果您将自己限制在那些不会尝试获取 const 迭代器的算法中,则可以忽略它们。

【讨论】:

  • 我确实查看了该部分,它肯定有助于确定自定义迭代器需要支持哪些操作,我只是不确定关于 constness 的最佳实践。无论如何,感谢您在此处提供一些说明。
  • 我认为这个问题几乎是一个公认的答案,您能否澄清const std::shared_ptr<T>& 是否是 const 迭代器的要求?
  • 在返回类型上不使用 const 允许更改值(也更改重载分辨率),这将首先删除所有具有 const_iterator 的值。
  • 所以这是一个语义问题,这就是我的想法。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2015-11-20
  • 2023-04-04
  • 2020-11-17
  • 1970-01-01
相关资源
最近更新 更多