Miroslav Krajcir
Miroslav Krajcir

Reputation: 155

c++ returning const reverse iterator from a class method, but method cannot be const?

I am trying to return a const reverse iterator from a class method. But my code doesn't compile when I mark my method as const. Without const the code compiles with no troubles.

Any idea why?

#include <iostream>
#include <vector>

template <class ValueType>
class DynamicDataComponent {
    using ValuesType = std::vector<ValueType>;
    using IteratorType = typename std::vector<ValueType>::reverse_iterator;

public:
    DynamicDataComponent()
    {
        values.push_back(0);
        values.push_back(1);
        values.push_back(2);
        values.push_back(3);
    }

    const IteratorType getRBeginIt() const {
        return values.rbegin();
    }

private:
    ValuesType values;
};

int main() {
    DynamicDataComponent<size_t> dataComponent;
    std::cout << *dataComponent.getRBeginIt() << "\n";
}

Upvotes: 0

Views: 122

Answers (1)

Ted Lyngmo
Ted Lyngmo

Reputation: 118017

You need to define a const-iterator too:

using ConstIteratorType = std::vector<ValueType>::const_reverse_iterator;

And define your const qualified member function like so:

ConstIteratorType getRBeginIt() const {
    return values.rbegin(); // or even `return values.crbegin()` to be clear
}

Note that a const-iterator is not a const iterator. The ConstIteratorType instance returned by getRBeginIt() const isn't const (or else you wouldn't be able to iterate with it), but when you dereference the iterator, it'll return a const ValueType& or const ValueType*.

Upvotes: 7

Related Questions