【问题标题】:Iterator over pointer to pointer structure指向指针结构的指针的迭代器
【发布时间】:2018-09-04 06:53:22
【问题描述】:

我在两个结构上编写了一个自定义容器:一个 T T* _a 数组和一个指向 T T** _b 的指针数组。 第一个数组是一个简单的数组,第二个数组包含指向第一个单元格的指针。

这两种结构的迭代器都是 const 和随机访问的。我已经实现了所有方法,第一个结构的迭代器工作正常。对于第二个......不是那么多。 编译时,当我尝试使用 begin()end() 迭代元素时出现此错误:

error: invalid conversion from ‘int**’ to ‘const int**’ [-fpermissive]
         return const_iterator(_b);

但我不知道如何解决它。我知道这是因为构造函数要求一个指向常量指针的指针

const_iterator(const T **p) : ptr(p) {}

但这不是我所拥有的,因为_b 是容器的一个属性,它不是恒定的。对于另一个迭代器,它工作得很好(唯一改变的是迭代器类中的几个取消引用)。

Here's 有问题的迭代器的代码。 Here's 有效的那个。除了我做的那个之外,应该还有什么其他的不同吗?谢谢!

【问题讨论】:

  • T const ** != T *const* != T **const.
  • 指针声明应该按照螺旋规则读取,在这种情况下,它被“简化”为从右到左的读取顺序。所以const T **p不是一个常量指针,它是一个非常量指针,指向非常量T的非常量指针。
  • 我知道const_iterator 的参数是一个指向常量T 的指针。对于我的另一个(工作)迭代器,我有other_const_iterator(const T *p) : ptr(p) {},它可以工作,并且会有一个非指向常量 T 的常量指针。因此,在const_iterator 中有一个非常量指针指向指向常量 T 的非常量指针对我来说似乎是合乎逻辑的,但似乎并非如此。也许问题不存在,但错误只是在那一点上窒息。但我还是不明白。
  • int* 可以隐式转换为const int*,但int** 不能隐式转换为const int**:如果允许这样的转换,它将允许修改 const 变量而不任何显式强制转换,从而违反 const 正确性。使ptr 具有const T* const*T* const* 类型(任何一个都应该工作;您决定您的设计是需要深还是浅const 传播)。
  • 非常感谢,这就是问题所在,我不太了解 const 衰减以及如何阅读声明。

标签: c++ stl const-iterator


【解决方案1】:

答案正如 Igor 在 cmets 中所说的将 int** 转换为 const int**。我认为它像 int* 一样工作,但事实并非如此。我找到了更多信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2012-03-28
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多