是否应该避免从非常量迭代器到常量迭代器的转换?

时间:2018-10-25 11:28:10

标签: c++ iterator const-iterator

我试图将const iteratornon-const iterator进行比较,但是不确定是否可以,因此我进行了查找。我发现这是可以的,因为从non-const iteratorconst iterator的隐式转换。但是,我想知道您是否应该不比较这些迭代器,以避免这种转换。例如,

begin_iterator = buf.begin();  end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }

通常,我认为这个OK是因为const表示只读,这很好。但是,我不确定(不必要的)转换。

2 个答案:

答案 0 :(得分:5)

将非const迭代器转换为const迭代器总是很好,就像将非const指针转换为const指针一样。

相反,这不是您要做的事情,它可能导致崩溃(例如,因为数据存储在const only space中)。所以永远不要做。

答案 1 :(得分:1)

虽然在这种情况下这可能有效,但它不是用于创建范围的标准模式。特别是,标准算法需要两个相同类型的迭代器,例如export class Foobar { constructor(public Component: typeof Foo) {} } 将不会编译。

结果,问题中的代码创建了一个维护问题。假设维护人员意识到for循环正在执行可以用标准算法完成的工作。显而易见的转换是用算法替换for循环。所以

std::fill(whatever.begin(), whatever.cend(), 3)

成为

begin_iterator = buf.begin();  end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }

但是不能编译,因此维护者必须四处寻找,发现两个迭代器不是同一类型,然后弄清楚更改的类型是否可行迭代器,以匹配开始迭代器。这意味着要检查使用最终迭代器的所有位置,以确定为什么它是不同的类型以及它是否重要。

因此,真正的问题是,这可以解决什么问题,值得花多少钱?通常,第一个答案是“什么都不重要”,第二个答案是“否”。