Вернуть указатель на локальную переменную?? (предупреждение 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" отсутствует в таблице содержащихся функций... Как бы определить такую вещь? Так как я не хочу возвращать итераторы...