invoke(std::function<void(T)> f, T val)
{
f(val);
}
int main()
{
auto printer = [](int x){ std::cout << x; };
::invoke(printer, 42);
}
лень разбирать детали, но достаточно подавить попытку дедукции по T из std::function https://godbolt.org/z/7Gd6foMv4
В любом случае, это плохой стиль кодирования. До концептов надо писать template <typename Callable, typename Val> void invoke(Callable const& callable, Val&& val) { callable(std::forward<Val>(val)); } с концептами - поставить соответствующее ограничение на параметр класс std::function это класс типа TypeErasure, он не должен встречаться в сигнатурах шаблонов функций
Что значит дедукция из function?
Как я понимаю, была попытка вывести тип T из std::function<void(T)> и она провалилась
компилятор пытается понять какой тип T ты хочешь подставить, но тут нетривиально он сидит в function, ему нужно детектить ещё и тип function, для неё нет deduction guide(не написан), он ломается и говорит да пшёл ты знаешь куда
оригинальный пример: std::function printer = [](int x){ std::cout << x; }; //OK std::function printer = [](int const& x){ std::cout << x; }; //ошибка: не понимаю, printer<int> или printer<int const&>
ты фигню пишешь, там есть гайд
возможно, короче формулируется это примерно так, что если для вывода типа нужен вывод типа, то так нельзя
возможно, deduction guide вообще не применяется при инстанцировании шаблона функции?)
Обсуждают сегодня