const到非const迭代器比较,它们是否有效

Mic*_*eyn 15 c++ c++11

我有两个迭代器到一个容器,一个const和一个非const.比较它们是否存在问题,看它们是否都引用了容器中的同一个对象?这是一个通用的C++ 11迭代器问题:

可以合法地比较const和非const迭代器,看看它们是否都引用同一个对象,与容器的类型无关(即,它们都是保证引用同一容器中的对象或容器末端的迭代器) (),但一个是const而另一个不是)?

例如,请考虑以下代码:

some_c++11_container container;

// Populate container
...

some_c++11_container::iterator iObject1=container.begin();
some_c++11_container::const_iterator ciObject2=container.cbegin();

// Some operations that move iObject1 and ciObject2 around the container
...

if (ciObject2==iObject1) // Is this comparison allowed by the C++11 standard?
  ...; //Perform some action contingent on the equality of the two iterators
Run Code Online (Sandbox Code Playgroud)

asc*_*ler 12

是的,这会像你期望的那样工作.

标准保证对任何容器类型some_container::iterator都可以隐式转换为some_container::const_iterator.

23.2.1 [container.requirements.general]中的第一个表,在定义X为包含类型对象的容器类型后T,具有:

表达: X::iterator

返回类型:值类型为的迭代器类型 T

注意:满足前向迭代器要求的任何迭代器类别.可转换为X::const_iterator.


表达: X::const_iterator

返回类型:值类型为的常量迭代器类型 T

注意:满足前向迭代器要求的任何迭代器类别.

(这些不是真正的表达式,而是类型,而不是具有"返回类型",但这就是它们被压缩到主要是表达式的表中的方式.)

所以,当你有ciObject2==iObject1,编译器注意到最好的operator==ciObject2==some_container::const_iterator(iObject1).并operator==在两个const_iterator告诉你他们是否引用相同的元素.

(我没有看到任何明确说明这种转换的结果与原始对象相同的对象iterator.我想这只是理解.)

  • 请注意,这不是容器的要求,而是标准中定义的容器的接口规范.所以它不适用于**all**迭代器,只适用于来自标准容器的迭代器.对于其他迭代器源(容器或其他),请检查您的文档. (4认同)