Ich habe versucht herauszufinden, wie Lambda in C++ funktioniert.Lambda erfasst unerwartete Variablen
Und etwas Seltsames passiert ist. Es ist so komisch, dass ich nicht weiß, wie ich es richtig beschreiben soll. Ich habe versucht, mehrere Schlüsselwörter zu googlen, aber fand nichts das Verhalten erwähnt.
Ich versuchte zuerst this code.
#include <iostream>
#include <utility>
using namespace std ;
auto func() {
int a = 0 ;
auto increase = [ &a ](int i = 1){ a += i ; } ;
auto print = [ &a ](){ cout << a << '\n' ; } ;
pair< decltype(increase), decltype(print) >
p = make_pair(increase, print) ;
return p ;
}
int main() {
auto lambdas = func() ;
auto increase = lambdas.first ;
auto print = lambdas.second ;
print() ;
increase() ;
print() ;
increase(123456) ;
print() ;
return 0;
}
Der Ausgang wird wie erwartet als
-1218965939
-1218965938
-1218842482
aber nachdem ich diese in die 'Func()' hinzufügen
cout << typeid(decltype(print)).name() << '\n'
<< typeid(decltype(increase)).name() << '\n' ;
wie this one
der Ausgang wurde
Z4funcvEUlvE0_
Z4funcvEUliE_
0
1
123457
Ich habe nicht erwartet zu passieren.
[UPDATE]
Die Variable a
sollte "tot" hat, weil sein Lebenszyklus beendet wurde.
Aber ich bin neugierig, warum die Code-Prüfungen typeid
und decltype
Ursache a
schienen wiederbelebt werden?
In einer anderen Anmerkung, 'auto erhöhen = [& a] (int i = 1) {a + = i; }; 'Dieser Standardparameter sollte verboten sein. Nicht sicher, warum es nicht ist. – user4581301
@ user4581301 Ich fand [dies] (http://stackoverflow.com/a/35831564/5161420), obwohl ich 'auto' nicht verwendet habe. – kaltu
Ah. Wieder einmal ist mein Wissen veraltet. Vielen Dank! – user4581301