Почему нет принудительного применения компилятора в const_iterator - PullRequest
1 голос
/ 26 ноября 2009

Рассмотрим следующий код:

#include <vector>
#include <iostream>

class a {
public:
    int i;
    void fun() { i = 999; }
    void fun() const { std::cout << "const fun" << std::endl; }
};

const a* ha() {
    return new a();
}

int main()
{
    std::vector<a *> v;
    v.push_back(new a());

    // cannot convert from 'const a *' to 'a *'
    // a* test = ha();

    std::vector<a *>::const_iterator iterator = v.begin();
    for (; iterator != v.end(); ++iterator) {
        // No enforcement from compiler? I do not want user to modify the content through
        // const_iterator.
        a* aa = (*iterator);
        aa->fun();
    }

    std::cout << (*(v.begin()))->i << std::endl;
    getchar();
}

Могу ли я узнать, почему я не получил ошибку компилятора от

a* aa = (*iterator);

Я хочу, чтобы компилятор сказал мне, что мне нужно использовать const_iterator следующим образом:

const a* aa = (*iterator);

Или это мое неправильное ожидание от const_iterator?

1 Ответ

1 голос
/ 26 ноября 2009

const_iterator говорит о том, что вы не можете изменить элемент в контейнере; то есть, если у вас есть контейнер указателей, вы не можете изменить указатель .

Вы не меняете указатель, вы меняете объект, на который указывает указатель .

Если вы попытаетесь назначить новый указатель на этот элемент в контейнере, он не сможет скомпилироваться:

*iterator = new a; // < Won't compile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...