Zwykle lambda C++ bez przechwytywania should be convertable do wskaźnika funkcji w stylu c. W jakiś sposób przekonwertowanie go za pomocą std::function::target
nie działa (tzn. Zwraca wartość nullptr), ale także target_type
nie pasuje do typu podpisu, mimo że wygląda na to samo.Captureless lambda nie może zostać przekonwertowany na wskaźnik funkcji, gdy jest przechowywany w std :: function
Testowane na VC13 i GCC 5,3/5.2.0/4,8
minimalna przykład badania:
#include <functional>
#include <iostream>
void Maybe() {
}
void callMe(std::function<void()> callback) {
typedef void (*ftype)();
std::cout << (callback.target_type() == typeid(ftype)) << std::endl;
std::cout << callback.target<ftype>() << std::endl;
}
int main() {
callMe([]() {});
callMe(Maybe);
}
oczekiwany wynik byłby
1
<address>
1
<address>
rzeczywista moc
0
0
1
<address>
Pytanie brzmi: dlaczego znak lambda różni się od funkcji przekazanej?
_ "... powinien być convertable do a ..." _ - wymagany cytat. – Useless
@Useless Hmmm, [cytat jest tutaj] (http://stackoverflow.com/a/28746827/1413395). –
@ πάνταῥεῖ dzięki, zawarłem to w pytaniu –