Ich habe in mehreren Beispielen zu sehen, dass Sie ein einzelnes Zeichen wie mehrere Variablen erfassen können die folgenden:Wie viel wird ein C++ 11-Lambda-Capture tatsächlich erfassen?
Rect rect;
Point point;
auto someLambda = [&](const SomeType& var)
{
if (rect.Contains(point))
{
var.Something();
}
this->MemberFunction();
};
Dies endet mit rect
und point
durch Verweis Grabbing und gibt auch Sie this
zugreifen, aber wie viel fängt es tatsächlich ein? Erfasst es nur die Variablen, die es benötigt, oder erfasst es buchstäblich alles, was es im aktuellen Bereich gibt?
ich in anderen Beispielen gesehen haben, dass Sie auch einzelne Variablen zu erfassen, wie dies angeben:
Rect rect;
Point point;
auto someLambda = [this, &rect, &point](const SomeType& var)
{
if (rect.Contains(point))
{
var.Something();
}
this->MemberFunction();
};
Gibt es irgendeinen Vorteil zu tun es die eine oder die andere? Jemand, mit dem ich einmal gearbeitet habe, erwähnte einmal, dass die Verwendung der "capture all" Version [&]
teurer ist, aber ich kann keine Dokumentation finden, die das unterstützt. Ich will nur sicher wissen, dass ich Code nicht komplexer mache, als es sein muss, oder teure Dinge tue, die ich nicht tun sollte.
Kurze Antwort: es erfasst jede Variable, die * odr-used * innerhalb des Lambda –
ist Sie sollten nur einzelne Mitglieder auflisten, wenn Sie keine andere Option haben, weil Sie für einige von ihnen verschiedene Capture-Methoden verwenden müssen. Mit '[&]' kann der Compiler herausfinden, welche Variablen basierend auf Ihrem Code verwendet werden. Wenn Sie jedoch versuchen, alles explizit aufzulisten, können Sie einige unnötige auflisten und ineffizienten Code generieren. –
@ M.M Auf der anderen Seite besteht aus Sicherheitsgründen weniger die Gefahr, dass der nächste Entwickler oder Sie unbeabsichtigt manipulierte Daten manipulieren, indem Sie angeben, welche Variablen Sie * im Lambda verwenden wollen. –