Aus meiner Erfahrung scheint es, dass entweder:C++ Adresse von Lambda-Objekten als Parameter an Funktionen
- Ein Lambda-Ausdruck in einem Funktionsaufruf erstellt unmittelbar nach dem Aufruf zerstört
- Aufruf eine Funktion, die ein
std::function
erwartet erzeugt ein temporäres Objekt (std :: function) aus dem Lambda, und dieses Objekt wird nach dem Aufruf zerstört
Dieses Verhalten kann mit dem folgenden Code-Schnipsel zu beachten:
const function<void()>* pointer;
void a(const function<void()> & f)
{
pointer = &f;
}
void b()
{
(*pointer)();
}
int main()
{
int value = 1;
std::cout << &value << std::endl;
// 1: this works
function<void()> f = [&]() { std::cout << &value << std::endl; };
a(f);
// 2: this doesn't
a([&]() { std::cout << &value << std::endl; });
/* modify the stack*/
char data[1024];
for (int i = 0; i < 1024; i++)
data[i] = i % 4;
b();
return 0;
}
Was genau passiert eigentlich im zweiten Fall? Gibt es eine korrekte Möglichkeit, a()
aufzurufen, ohne ein explizites Objekt std::function
zu erstellen?
Edit:: Diese beiden Versionen (1 und 2) kompiliert nur Recht, sondern führt in verschiedenen Ausgängen:
Version 1:
0x7fffa70148c8
0x7fffa70148c8
Version 2:
0x7fffa70148c8
0
Was meinst du damit, dass der zweite Fall "nicht funktioniert"? Kompiliert es? Stürzt es ab? Schreibt es "funktioniert nicht" zu Ihrem Drucker? – jalf
@jalf: Du hast vergessen: Stoppt es und fängt Feuer. – Grizzly
/* Ändern des Stapels */Die meisten Compiler weisen den erforderlichen Platz für ** alle ** lokalen Variablen bei der Funktionseingabe vor. –