问题描述:

I'm working on writing a class that essentially provides a flexible interface to some other data. I would like to iterate over elements using an STL conforming iterator and I'm on the right track by using boost::iterator_facade but I have a question regarding conformance that I can't seem to find an official answer to.

Do I have to provide a const iterator for STL conformance?

I'm using std::shared_ptr<T>& for the non-const dereferenced type that the iterator provides. If I do provide a const iterator, is it acceptable to provide a std::shared_ptr<T>& for my dereferenced type as opposed to a std::shared_ptr<const T>&?

I have a feeling that the answer to both is no, but I'm unable to find official sources that validate/invalidate those suspicions. I think the second question is more of a matter of semantics.

网友答案:

It is your decision how far the const should reach.

The standard way is, just slap a const on the element returned (possibly by reference) from the const_iterator. That's what the standard library does as well.
So, if the return type for your standard iterator is std::shared_ptr<T>&, then the return type for your constant iterator should be const std::shared_ptr<T>&.

BTW: Did you read the section of the standard describing requirements for iterators, like:

Random Access -> Bidirectional -> Forward -> Input
                                             Output

The full container interface provides const iterators as well as non-const iterators.
If you restrict yourself to those algorithms which won't try to get const iterators, you'll be fine omitting them.

相关阅读:
Top