Un'espressione lambda costruisce un tipo senza nome, con ciascuno avente un tipo diverso. Non sono implementazioni std::function
. Per saperne di più è fornito qui: What is a lambda expression in C++11? e qui: How to convert a lambda to an std::function using templates
Puoi svelare il tipo sul vostro compilatore specifico con un trucco del genere:
void foo(int);
int main() {
auto a = []{ return 1; };
auto b = []{ return 1; };
foo(a);
foo(b);
return 0;
}
compilazione con clangore sul mio mac dà:
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:11:5: error: no matching function for call to 'foo'
foo(a);
^~~
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:5:6: note: candidate function not viable: no known conversion from
'<lambda at /Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:8:14>' to 'int' for 1st argument
void foo(int);
^
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:13:5: error: no matching function for call to 'foo'
foo(b);
^~~
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:5:6: note: candidate function not viable: no known conversion from
'<lambda at /Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:9:14>' to 'int' for 1st argument
void foo(int);
@Barry indica che è possibile utilizzare typeid
invece. Se stampo fuori typeid(a).name()
e typeid(b).name()
sul mio sistema, ottengo:
Z4mainE3$_0
Z4mainE3$_1
che demangle a
main::$_0
main::$_1
Volevo solo includere questo per completezza. In realtà trovo la versione del messaggio di errore un po 'più informativa. :)
'std :: function' non ha connessioni di lingua come' std :: initializer_list'. – chris
Deriva dalla mia mancanza di conoscenza. Puramente casuale. – texasbruce
Il tipo di Lambda è [non specificato] (http://stackoverflow.com/questions/7951377/che-è-il-tipo-di-lambda-qualificato-con-auto-in-c11). – Marcin