#include <iostream>
#include <functional>
std::function<void()> task;
int x = 42;
struct Foo
{
int& x;
void bar()
{
task = [=]() { std::cout << x << '\n'; };
}
};
int main()
{
{
Foo f{x};
f.bar();
}
task();
}
Mein Instinkt war, dass, als der tatsächliche referent noch existiert, wenn die Aufgabe ausgeführt wird, wir eine neu gebundene Referenz zu dem Zeitpunkt erhalten das Lambda angetroffen wird und alles ist in Ordnung.
Allerdings, auf meinem GCC 4.8.5 (CentOS 7), sehe ich etwas Verhalten (in einem komplexeren Programm), die darauf hindeutet, dass dies stattdessen UB ist, weil f
, und die Referenz selbst, gestorben sind. Ist das richtig?
ich bin nicht sicher, ich verstehe. In Task binden Sie an 'int & x', das nicht mehr gültig ist, wenn' Foo' zerstört wird. – freakish
Ich nehme an, ein "wörtliches" Lesen des Programms sagt, dass ich ein 'this' gefangen habe, das außerhalb des Geltungsbereichs liegt und dass' x' innerhalb der Aufgabe für ein jetzt ungültiges 'this -> x' kurz ist. –
@freakish: Aber mache ich? Binde ich keine neue Variable an ':: x'? Woran ist 'r2' gebunden in' int x = 42; int & r1 = x; int & r2 = r1; '? –