Ich war ziemlich überrascht, als ich feststellte, dass der folgende Code tatsächlich funktioniert:
%Vor% Scheint so, als ob std::tr1::function
aus einem Objective-C-Block konstruiert werden könnte, aber ich bin mir nicht sicher, wie, da (zuletzt habe ich das überprüft), seine Implementierung nicht speziell Blöcke behandelt. Ist es irgendwie implizit den zugrunde liegenden Funktionszeiger auszusaugen? Ist dieses Verhalten auch nicht definiert und wird sich wahrscheinlich ändern?
Update: Ich lag falsch, hier ist, warum es wirklich funktioniert
Der Vorlagenparameter std::tr1::function
definiert einfach die Signatur des resultierenden Funktionsobjekts, nicht den Typ, der tatsächlich umbrochen wird. Das umgebrochene Objekt muss also nur eine operator()
mit passender Signatur anbieten. Blockreferenzen, wie Funktionszeiger, haben implizit eine solche operator()
(offensichtlich können Sie sie also aufrufen).
Alte, falsche Antwort (daher machen die Kommentare Sinn)
Ich vermute stark, dass es funktioniert, weil der Block keine Variablen aus dem umgebenden Bereich erfasst. In diesem Fall gibt es keinen zu wartenden Zustand, so dass eine Blockreferenz als bloßer Funktionszeiger dargestellt werden kann. Wenn wir den Code in
ändern %Vor% es sollte nicht kompiliert werden, da der Block den erfassten Wert von counter
mit sich herum tragen muss. (es sei denn, die Implementierung von std::tr1::function
wurde speziell aktualisiert, um Blöcke zu unterstützen)
Obwohl Sie Blöcke als Objective-C-Objekte behandeln können und Objective-C eine große Anzahl von Blöcken unterstützt, sind Blöcke nicht auf Objective-C beschränkt. Sie können auch Blöcke in C und C ++ verwenden. Weitere Informationen finden Sie in diesem Artikel .
Tags und Links c++ objective-c++ objective-c-blocks