Есть следующая функция, она должна возвращать ссылку на значение ключа, если ключ такой существует в словаре, иначе выбрасывать исключение, но почему-то она возвращает вместо ссылки значение. Почему так происходит?
template<class K, class V> V& GetRefStrict(map<K, V> container, const K& key) {
if(auto it = container.find(key); it != container.end()) {
return it->second;
}
throw runtime_error("Unfortunately this key didn't finded");
}
int main() {
map<int, string> m = {{0, "value"}};
string& item = GetRefStrict(m, 0);
item = "newvalue";
cout << m[0] << endl; // returns value instead newvalue
}
Брр! Ссылку на переменную, которая удаляется при выходе из функции? У вас программа вообще свалиться должна, по-хорошему...
Вы передаете map по значению, создается копия, которая умирает при выходе из функции, итератор указывает в не пойми куда, вы меняете что-то где-то... Но только не в вашем исходном m. Делайте так:
GetRefStrict(map<K, V>& container,
Обратите внимание на &.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей