Функция не возвращает ссылку

158
04 августа 2021, 00:50

Есть следующая функция, она должна возвращать ссылку на значение ключа, если ключ такой существует в словаре, иначе выбрасывать исключение, но почему-то она возвращает вместо ссылки значение. Почему так происходит?

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
}
Answer 1

Брр! Ссылку на переменную, которая удаляется при выходе из функции? У вас программа вообще свалиться должна, по-хорошему...

Вы передаете map по значению, создается копия, которая умирает при выходе из функции, итератор указывает в не пойми куда, вы меняете что-то где-то... Но только не в вашем исходном m. Делайте так:

GetRefStrict(map<K, V>& container, 

Обратите внимание на &.

READ ALSO
Подключение файлов в C++

Подключение файлов в C++

Иногда работаю с IDE на Андроиде (в основном Dcoder)Как можно подключить (и можно ли вообще) заголовочный либо любой другой файл средствами языка,...

161
Очередь на 6ти стеках

Очередь на 6ти стеках

хочу написать очередь (с нуля на с++) используя 6 стеков(так как прочитал что ее можно написать так, чтобы любая операция выполнялась за О(1))...

88
Наследование методов в C++

Наследование методов в C++

Хочу реализовать класс Vector как сущность линейного пространства, а затем от него наследовать обычный DoubleVector и MatrixДля этого мне бы хотелось...

122