C ++: Lambda in sich selbst zerstören [duplizieren]

9
%Vor%

Hier ist die Variable ptr , die von Lambda erfasst wird, und während functor() wird der Aufruffunktor zuerst durch functor = nullptr gelöscht und dann auf ptr zugegriffen. Ich denke, dass ptr beschädigt wurde, da es ein Feld eines gelöschten Funktors war. Alle Compiler führen dieses Programm erfolgreich ohne Abstürze aus und drucken "9", aber ich bezweifle immer noch, dass dies kein undefiniertes Verhalten ist. Kann es jemand bestätigen?

    
user3514538 05.03.2018, 16:34
quelle

1 Antwort

8

Es ist tatsächlich undefiniert.

So können Sie es bestätigen:

%Vor%

Der obige Code wird gedruckt (auf GCC und Clang):

%Vor%

Die drei zerstörten Instanzen sind: eine, die vom ursprünglichen Lambda erfasst wird, eine, die von einer in functor gespeicherten Kopie erfasst wird, und eine, die von einem temporären std::function::operator=(F &&) aus irgendeinem Grund erfasst wird muss machen.

    
HolyBlackCat 05.03.2018, 16:40
quelle

Tags und Links