C ++: передача по ссылке и ключевое слово const - PullRequest
2 голосов
/ 23 июля 2010

У меня есть вопрос, касающийся передачи карты по ссылке. Давайте рассмотрим следующий фрагмент кода:

void doNotChangeParams(const map<int, int>& aMap){

    if (aMap.find(0) != aMap.end()){
        cout << "map[0] = " << aMap[0] << endl;
    }
}

и у меня есть карта myMap и я делаю вызов следующим образом: doNotChangeParams (myMap)

Теперь видно, что я не изменяю параметр aMap внутри функции. Тем не менее мой компилятор g ++ жалуется, что доступ aMap [0] отбрасывает спецификатор const .

Я помещаю const , так как я хочу сказать читателям этой функции, что я не изменяю аргумент. Кроме того, это помогает генерировать ошибки компиляции, когда я случайно изменяю карту.

В настоящее время я должен отбросить const , и я думаю, что из-за сигнатуры метода читатель не сможет понять вышеуказанное значение. Я знаю, что комментарий подойдет, но я полагаю, я бы просто спросил, если вы знаете какие-либо "программные" способы.

Спасибо, ребята.

1 Ответ

4 голосов
/ 23 июля 2010

Оператор [] для std::map не является константным. Это потому, что он добавит ключ со значением по умолчанию, если ключ не найден. Таким образом, вы не можете использовать его для ссылки на карту const. Вместо этого используйте итератор, возвращаемый find:

typedef map<int, int> MyMapType;

void doNotChangeParams(const MyMapType& aMap){
    MyMapType::const_iterator result = aMap.find(0);
    if (result != aMap.end()){
        cout << "map[0] = " << result->second << endl;
    }
}
...