Ну, визуальная студия дает мне предупреждение. Я понимаю предупреждение & Я знаю, что это не ошибка. Однако я не понимаю, ПОЧЕМУ я вижу предупреждение — и, что еще хуже, я не понимаю, как предотвратить / какие потенциальные проблемы оно может дать.
Код написан ниже, функция, которая должна возвращать (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» отсутствует в таблице содержащихся функций … Как бы определить такую вещь? Так как я не хочу возвращать итераторы …
попытаться заменить return i:
return (*i).second
Других решений пока нет …