Właśnie zacząłem uczyć się nowych funkcji w C++ 11. Czytałem o lambdach w C++ Primer (Stanley Lippman) i eksperymentowałem z nimi.Wyrażenia lambda C++ - w jaki sposób kompilator je interpretuje?
Próbowałem następujące fragmenty kodu:
auto func() -> int (*)(){
//int c=0;
return []()-> int {return 0;};
}
int main(){
auto p = func();
}
ten kod skompilowany w porządku. Sądzę więc, że lambdy bez jakichkolwiek przechwytów są generowane przez kompilator jako zwykłe funkcje i możemy użyć do nich normalnego wskaźnika funkcji.
Teraz zmieniłem kod używać przechwytuje:
auto func() -> int (*)(){
int c=0;
return [=]()-> int {return c;};
}
int main(){
auto p = func();
}
Ale to nie udało się skompilować. Mam następujący błąd kompilacji podczas korzystania g ++:
main.cpp: In function ‘int (* func())()’:
main.cpp:6:31: error: cannot convert ‘func()::__lambda0’ to ‘int (*)()’ in return
return [=]()-> int {return c;};
Z błędu mogę zrozumieć, że nie jest to normalna funkcja, która jest generowana i może prawdopodobnie być klasą z przeciążonej call-operatora. A może to coś innego?
Moje pytania: W jaki sposób kompilator obsługuje wewnętrznie lambdy? W jaki sposób powinienem przekazać informacje o lambdach, które używają przechwytujących, tj. Jaka powinna być wartość zwracana przez func()? Nie mogę obecnie myśleć o przypadku użycia, w którym musiałbym używać takich lambdas, ale chcę po prostu lepiej o nich wiedzieć. Proszę pomóż.
Dzięki.
Try ten link: http://www.cprogramming.com/c++11/c++11-lambda-closures.html –