Рассмотрим следующий пример
void foo(const std::function<int()>& f) {
std::cout << f() << std::endl;
}
void foo(const std::function<int(int x)>& f) {
std::cout << f(5) << std::endl;
}
int main() {
foo([](){return 3;});
foo([](int x){return x;});
}
Это не скомпилируется, потому что вызов foo
называется неоднозначным. Насколько я понимаю, это связано с тем, что функция лямбда не является априорной a std::function
, но должна быть отброшена на нее и что существует конструктор std::function
, который принимает произвольный аргумент.
Может кто-то может объяснить мне, почему кто-то создал неявный конструктор, который принимает произвольный аргумент. Однако мой вопрос заключается в том, существует ли обходное решение, которое позволяет использовать сигнатуру функции лямбда-функций для перегрузки функции foo
. Я пробовал указатели функций, но это не сработало, потому что захват лямбда-функций не может быть применен к нормальному указателю функции.
Любая помощь приветствуется.