Вернуть указатель на локальную переменную?? (предупреждение C4172)

Ну, визуальная студия дает мне предупреждение. Я понимаю предупреждение и знаю, что это не ошибка. Однако я не понимаю, ПОЧЕМУ я вижу предупреждение - и, что еще хуже, я не понимаю, как предотвратить / какие потенциальные проблемы оно может дать.

Код написан ниже, функция, которая должна возвращать (const) ссылку на std::function<> (fun_type_cref) ища заданное "id" в контейнере.
Контейнер хранится как [id, fun_type] пар.

Handler::fun_type_cref Handler::Overwrite() const
{
    auto i(container.find(OVERWRITE));
    if (i != container.end()) {
        return *i;
    } else {
        return nullptr;
    }
}

Точное предупреждение появляется в обоих операторах возврата

предупреждение C4172: возвращение адреса локальной или временной переменной

Что вызывает эту ошибку? Я просто возвращаю ссылку на содержащийся объект, верно? *i не создаст копию объекта, верно? Я нигде не вижу себя, принимающего адрес чего-то?

Я мог понять второе, когда я возвращал ссылку на локально созданный функциональный объект, однако не было конкретного случая для возврата ссылок для компиляции временных констант или что-то в этом роде?


РЕДАКТИРОВАТЬ: Хорошо решил первую проблему простое несоответствие типов, кажется, как я забыл на самом деле вернуть правильную часть возвращенного итератора - должен был return i->second, Странная визуальная студия не выдала мне ошибку несоответствия типов, и компилятор мог преобразовать std::pair<std::string, std::function<...> > к std::function<...>

Теперь возникает вопрос о второй возвращаемой части - я хочу, чтобы функция возвращала "значение по умолчанию" (которое было бы NO-OP), когда идентификатор "OVERWRITE" отсутствует в таблице содержащихся функций... Как бы определить такую ​​вещь? Так как я не хочу возвращать итераторы...

1 ответ

Решение

Попытаться заменить return i:

return (*i).second

Другие вопросы по тегам