Nehmen wir an, ich habe zwei lokale Smartpointer, foo
und bar
.C++ 11: In welcher Reihenfolge werden Lambda-Erfassungen zerstört?
shared_ptr<Foo> foo = ...
shared_ptr<Bar> bar = ...
Diese intelligente Zeiger sind Wrapper um Ressourcen, die aus irgendeinem Grund in der Reihenfolge foo
zerstört werden müssen, dann bar
.
Jetzt möchte ich ein Lambda erstellen, das foo
und bar
verwendet, aber überlebt den Geltungsbereich, der sie enthält. Also würde ich sie von Wert erfassen, wie folgt aus:
auto lambda = [foo, bar]() { ... };
Dies erstellt Kopien von foo
und bar
innerhalb des Funktionsobjekts. Wenn das Funktionsobjekt zerstört wird, werden diese Kopien ebenfalls zerstört, aber ich sorge mich um die Reihenfolge, in der dies geschieht. Meine Frage ist also:
Wenn ein Lambda-Objekt zerstört wird, in welcher Reihenfolge werden seine Nebenwerte zerstört? Und wie kann ich (hoffentlich) diese Reihenfolge beeinflussen?
Ich denke, es wäre interessant, auch zu prüfen, '[=]'. –
@ R.MartinhoFernandes: '[foo, bar]' ist äquivalent zu '[= foo, = bar]', d. H. Es ist eine Kopie. –
@David: Ich glaube, er meinte wörtlich '[=]', d. H., Was die Deklarationsreihenfolge wäre, ohne die Variablen selbst aufzulisten. (Offensichtlich ist dies ein Streitpunkt, da die Deklarationsreihenfolge unabhängig davon, wie die Captures ausgeführt werden, unbestimmt ist.) – ildjarn