Warum funktioniert std :: tr1 :: function mit Objective-C Blocks?

9

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?

    
Jonathan Sterling 09.04.2011, 19:31
quelle

2 Antworten

5

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)

    
pmdj 17.04.2011, 09:34
quelle
0

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 .

    
Caleb 17.04.2011 15:07
quelle