我有两个迭代器到一个容器,一个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
.我想这只是理解.)
归档时间: |
|
查看次数: |
1959 次 |
最近记录: |