Reihenfolge der Ausführung im Operator

8

Ich habe Schwierigkeiten, die Reihenfolge der Aufrufe im folgenden Code zu verstehen. Ich habe erwartet, die Ausgabe unter

zu sehen %Vor%

Ich kann zwar sehen, dass die Ausgabe, die ich bekomme,

ist %Vor%

Ich dachte, dass der Aufruf std::cout<< b->fooA() << b->fooB() << std::endl dem Aufruf

entspricht %Vor%

aber ich kann sehen, dass dies nicht der Fall ist. Kannst du mir helfen, besser zu verstehen, wie das funktioniert und wie die Beziehung zum globalen operator<< aussieht? Wird diese letzte jemals in dieser Reihenfolge aufgerufen?

Grüße

AFAG

%Vor%     
Abruzzo Forte e Gentile 11.02.2013, 10:11
quelle

3 Antworten

8

Der Compiler kann die Funktion printcbase() wie folgt auswerten:

%Vor%

oder einige von vielen Permutationen von Linien, die mit 1 - 4 markiert sind. Es wird nur garantiert, dass die Linie 1 vor der Linie 3 und die Linie 2 vor der Linie 4 (und natürlich Linie 3 vor Linie 4) erfolgt. Standard sagt nicht mehr und in der Tat können Sie unterschiedliche Ergebnisse mit verschiedenen C ++ - Compilern erwarten.

    
mity 11.02.2013, 10:25
quelle
4

Die Reihenfolge der Ausführung von << ist gut definiert, aber die Reihenfolge der Auswertung von Unterausdrücken ist in C ++ nicht definiert. Dieser Artikel und das C-Codebeispiel veranschaulichen das von Ihnen erwähnte Problem.

BA12 und AB12 sind beide korrekt. Im folgenden Code:

%Vor%

1 wird vor 2 angezeigt, aber A könnte vor oder nach B erscheinen, da der Compiler nicht verspricht, zuerst fooA oder fooB auszuwerten.

    
Salman A 11.02.2013 10:53
quelle
1

Die Verschiebungsoperatoren sind linksassoziativ; a << b << c wird als (a << b) << c gelesen, was bedeutet, dass, wenn a vom Typ benutzerdefiniert operator<< ist (und diesen Typ zurückgibt), der Ausdruck als a.operator<<(b).operator<<(c) gelesen wird. Wenn stattdessen ein freies operator<< verwendet wird, wird dies als operator<<(operator<<(a, b), c) gelesen.

So wird die Auswertung von a << b vor der Auswertung von (a << b) << c sequenziert, aber es gibt keine Sequenzabhängigkeit zwischen der Auswertung von b und c :

%Vor%

Wenn wir die Nebenwirkungen wie oben beschrieben nummerieren, können die Nebenwirkungen wie folgt sequenziert werden:

%Vor%     
ecatmur 11.02.2013 10:54
quelle