是否应该避免从非 const 迭代器到 const 迭代器的转换?
Should conversions from non-const iterator to const iterator be avoided?
我试图将 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) { ... }
通常,我会认为这没问题,因为 const 表示只读,这很好。但是,我不确定(不必要的)转换。
将非 const 迭代器转换为 const 迭代器总是没问题,就像将非 const 指针转换为 const 指针一样。
你不想做相反的事情,它会导致崩溃(因为数据只存储在 const 中 space,例如)。所以永远不要这样做。
虽然这在本例中可能有效,但这不是创建范围的标准模式。特别是,标准算法需要两个相同类型的迭代器,因此,例如 std::fill(whatever.begin(), whatever.cend(), 3)
将无法编译。
因此,问题中的代码造成了维护问题。假设维护者意识到 for 循环正在做一些可以用标准算法完成的事情。明显的改造就是用算法代替for循环。所以
begin_iterator = buf.begin(); end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }
变成
begin_iterator = buf.begin(); end_iterator = buf.cend();
std::whatever(begin_iterator, end_iterator);
但这并不能编译,所以维护者必须四处寻找并发现这两个迭代器不是同一类型,然后弄清楚是否可以 更改匹配开始迭代器的结束迭代器的类型。这意味着检查所有使用结束迭代器的地方,以确定为什么它是不同的类型以及这是否重要。
所以真正的问题是,这解决了什么问题,成本是否值得?一般来说,第一个的答案是"nothing important",第二个的答案是"no".
我试图将 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) { ... }
通常,我会认为这没问题,因为 const 表示只读,这很好。但是,我不确定(不必要的)转换。
将非 const 迭代器转换为 const 迭代器总是没问题,就像将非 const 指针转换为 const 指针一样。
你不想做相反的事情,它会导致崩溃(因为数据只存储在 const 中 space,例如)。所以永远不要这样做。
虽然这在本例中可能有效,但这不是创建范围的标准模式。特别是,标准算法需要两个相同类型的迭代器,因此,例如 std::fill(whatever.begin(), whatever.cend(), 3)
将无法编译。
因此,问题中的代码造成了维护问题。假设维护者意识到 for 循环正在做一些可以用标准算法完成的事情。明显的改造就是用算法代替for循环。所以
begin_iterator = buf.begin(); end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }
变成
begin_iterator = buf.begin(); end_iterator = buf.cend();
std::whatever(begin_iterator, end_iterator);
但这并不能编译,所以维护者必须四处寻找并发现这两个迭代器不是同一类型,然后弄清楚是否可以 更改匹配开始迭代器的结束迭代器的类型。这意味着检查所有使用结束迭代器的地方,以确定为什么它是不同的类型以及这是否重要。
所以真正的问题是,这解决了什么问题,成本是否值得?一般来说,第一个的答案是"nothing important",第二个的答案是"no".