【发布时间】: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 是容器的一个属性,它不是恒定的。对于另一个迭代器,它工作得很好(唯一改变的是迭代器类中的几个取消引用)。
【问题讨论】:
-
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