Rozważmy następujący przykładprzeciążenie Funkcja użyciu lambda funkcja podpis
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;});
}
nie skompilować, ponieważ wywołanie foo
mówi się niejednoznaczna. O ile rozumiem, wynika to z faktu, że funkcja lambda nie jest a priori a std::function
, ale musi zostać do niej rzucona i że istnieje konstruktor std::function
, który przyjmuje dowolny argument.
Może ktoś może mi wyjaśnić, dlaczego ktoś utworzył niejawny konstruktor, który bierze arbitralny argument. Jednak moje jednoznaczne pytanie dotyczy tego, czy istnieje obejście, które umożliwia wykorzystanie funkcji sygnatury funkcji lambda do przeciążenia funkcji foo
. Próbowałem wskaźników funkcji, ale to nie działało, ponieważ przechwytywanie funkcji lambda nie może być rzutowane na normalny wskaźnik funkcji.
Każda pomoc jest mile widziana.
To prawdopodobnie błąd w MSVC. Działa w Clang/GCC. –
O Microsoft, jesteś taki zabawny –
[Działa dla mnie] (http://ideone.com/XmAgLG). Który kompilator używasz? –