Вернуть указатель на локальную переменную ?? (предупреждение 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

1

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

Других решений пока нет …

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