6

这完美地工作:

list<int> l;
list<int>::const_iterator it;
it = l.begin();
list<int>::iterator it2;
it2 = l.begin();

我不明白的是如何list“知道”它必须返回iterator begin()版本或版本const_iterator begin() const

我正在尝试为我的容器(trie)实现迭代器,我遇到了这个问题。C++ 不应该不按返回类型处理差异化(除非使用奇怪的技巧)?

这是一些代码和我得到的编译器错误:

MyTrie<T>是一个模板化的 trie,可以包含任何类型。我有一个Trie<int>::iter非常量迭代器和一个Trie<int>::const_iter常量迭代器。iter begin()const_iter begin() const在 Trie 类中声明(和定义)。

Trie<int> t;
Trie<int>::const_iter it;
it = t.begin();

错误 :

../test/trie.cpp:181: error: no match for 'operator=' in 'it = Trie<T>::begin() [with T = int]()'
[..path..]/Trie.h:230: note: candidates are: Trie<int>::const_trie_iterator& Trie<int>::const_trie_iterator::operator=(const Trie<int>::const_trie_iterator&)

所以,我相信begin不使用非常量版本。

我考虑为非常量迭代器创建一个operator=(const Trie<T>::const_trie_iterator&)方法,但我在STDlib 中看不到它,我必须对迭代器进行 const_cast。我该怎么办?

4

2 回答 2

6

在标准容器中,非常量迭代器可以隐式转换为 const_iterator。返回的类型仅基于begin()被调用的对象/引用的 const-ness,在您的情况下是iterator,存在允许稍后分配的转换。

特别是在 23.2.1 通用容器要求表 96 中,它说X::iterator必须可转换为X::const_iterator.

于 2012-09-28T20:33:50.380 回答
3

list 知道要返回哪种类型的迭代器,因为定义了两种 begin 方法,一种用于当列表为 const 时,另一种用于当它不是时。声明可能如下所示:

template<class T>
class list {
public:
    iterator<T> begin();
    const_iterator<T> begin() const;
}

在以下示例中,将返回第一个非 const 迭代器,因为列表不是 const:

void doSomething(list<int> &myList) {
    iterator<int> i = myList.begin();
    ...
}

在下一个示例中,列表被声明为 const,因此将使用返回 const_iterator 的第二个 begin 版本:

void doSomethingElse(const list<int> &myList) {
    const_iterator<int> i = myList.begin();
    ....
}

当然,迭代器总是可以强制转换为 const_iterator,因此您可以在任一示例中将 i 声明为 const_iterator,但如果您尝试在第二个示例中将 i 声明为迭代器,您将收到错误,因为 const_iterator不能隐式转换为迭代器。

于 2012-09-28T20:46:14.360 回答