如何开始()知道哪个返回类型返回(常量或非常量)?(How does begin() know wh

2019-09-23 04:21发布

这工作完全:

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

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

我试图实现迭代器我的容器(线索),我遇到了这个问题。 不是C ++应该不办理返回类型分化(用怪异的招数时除外)?

下面是一些代码和编译器错误,我得到:

我的Trie<T>是一个模板特里结构,它可以包含任何类型的。 我有一个Trie<int>::iter非const迭代器和一个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&)

所以我相信的非const版本begin不使用。

我曾考虑创建一个operator=(const Trie<T>::const_trie_iterator&)用于非常量迭代方法,但我不看到,在标准库和我不得不的const_cast迭代器。 我该怎么办?

Answer 1:

在标准集装箱中,非const迭代器是隐式转换为一个常量性。 返回的类型是完全基于对象/引用上的常量性begin()被调用,而你的情况是iterator ,有一个转换,让后来的分配。

特别是在23.2.1一般容器的需求,表96,它说, X::iterator必须转换为X::const_iterator



Answer 2:

清单知道那种迭代器的返回其因为有两个开头的方法定义,一个针对该列表是常量,一个是当它不是。 该声明可能会是这个样子:

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

在下面的例子中,第一,非const迭代器将返回,因为列表不是常量:

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

在下面的例子中,列表声明为const,使返回的const_iterator开始的第二个版本将用来代替:

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

当然,一个迭代器总是可以转换为常量性,所以你可以宣布我以在任例如常量性,但如果你试图声明我是一个迭代器在第二个例子中,你会得到一个错误,因为一个常量性不能被隐式转换为一个迭代。



文章来源: How does begin() know which return type to return (const or non-const)?
标签: c++ std