我试图将const iterator
与non-const iterator
进行比较,但是不确定是否可以,因此我进行了查找。我发现这是可以的,因为从non-const iterator
到const iterator
的隐式转换。但是,我想知道您是否应该不比较这些迭代器,以避免这种转换。例如,
begin_iterator = buf.begin(); end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }
通常,我认为这个OK是因为const表示只读,这很好。但是,我不确定(不必要的)转换。
答案 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) { ... }
但是不能编译,因此维护者必须四处寻找,发现两个迭代器不是同一类型,然后弄清楚更改的类型是否可行迭代器,以匹配开始迭代器。这意味着要检查使用最终迭代器的所有位置,以确定为什么它是不同的类型以及它是否重要。
因此,真正的问题是,这可以解决什么问题,值得花多少钱?通常,第一个答案是“什么都不重要”,第二个答案是“否”。