константная ссылка в диапазоне на основе цикла не работает

Я думал, что вы можете использовать константную ссылку в петлях на основе диапазона в C ++ 11, но когда я компилирую этот код, используя g ++:

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>

int main() {
std::vector<std::unordered_map<std::string, int> > coordinates {
{{"x", 50}, {"y", 50}},
{{"x", 25}, {"y", 75}},
{{"x", 326}, {"y", 412}},
};
for(const auto& i : coordinates) {
std::cout << "{\"x\" : " << i["x"] << ", \"y\" : " << i["y"] << "}\n";
}
}

Я получаю эту ошибку:

const_error.cc:13:38: error: no viable overloaded operator[] for type 'const
std::__1::unordered_map<std::__1::basic_string<char>, int,
std::__1::hash<std::__1::basic_string<char> >,
std::__1::equal_to<std::__1::basic_string<char> >,
std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
int> > >'
std::cout << "{\"x\" : " << i["x"] << ", \"y\" : " << i["y"] << "}\n";
~^~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1131:18: note:
candidate function not viable: 'this' argument has type 'const
std::__1::unordered_map<std::__1::basic_string<char>, int,
std::__1::hash<std::__1::basic_string<char> >,
std::__1::equal_to<std::__1::basic_string<char> >,
std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
int> > >', but method is not marked const
mapped_type& operator[](const key_type& __k);
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1133:18: note:
candidate function not viable: 'this' argument has type 'const
std::__1::unordered_map<std::__1::basic_string<char>, int,
std::__1::hash<std::__1::basic_string<char> >,
std::__1::equal_to<std::__1::basic_string<char> >,
std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
int> > >', but method is not marked const
mapped_type& operator[](key_type&& __k);
^
const_error.cc:13:64: error: no viable overloaded operator[] for type 'const
std::__1::unordered_map<std::__1::basic_string<char>, int,
std::__1::hash<std::__1::basic_string<char> >,
std::__1::equal_to<std::__1::basic_string<char> >,
std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
int> > >'
std::cout << "{\"x\" : " << i["x"] << ", \"y\" : " << i["y"] << "}\n";
~^~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1131:18: note:
candidate function not viable: 'this' argument has type 'const
std::__1::unordered_map<std::__1::basic_string<char>, int,
std::__1::hash<std::__1::basic_string<char> >,
std::__1::equal_to<std::__1::basic_string<char> >,
std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
int> > >', but method is not marked const
mapped_type& operator[](const key_type& __k);
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1133:18: note:
candidate function not viable: 'this' argument has type 'const
std::__1::unordered_map<std::__1::basic_string<char>, int,
std::__1::hash<std::__1::basic_string<char> >,
std::__1::equal_to<std::__1::basic_string<char> >,
std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
int> > >', but method is not marked const
mapped_type& operator[](key_type&& __k);
^

Но когда я удаляю const из диапазона для цикла, он работает просто отлично. Почему мой код не скомпилируется нормально с ссылкой на const?

2

Решение

operator[] не постоянный Если ключ не существует, он добавляет объект значения к этому ключу.

использование unordered_map::at вместо.

3

Другие решения

[] оператор map а также unordered_map требует вызова неконстантного объекта, потому что он обновит объект для вставки новой записи, если она не существует для этого ключа.

Что ты хочешь случиться, если "x" нет на карте например?

  • Создать новую запись? Тогда вы не можете использовать const,
  • Генерировать ошибку во время выполнения? Тогда используйте find или какая-то другая функция, которая ищет карту, не изменяя ее, вместо [],
3

По вопросам рекламы [email protected]