2015-07-30 16 views
8

Sagen wir, wir haben Klasse A:Auftrag der Auswertung in Ketten Aufruf in C++

class A { 
public: 
    A& func1(int) { return *this; } 
    A& func2(int) { return *this; } 
}; 

und 2 standlone Funktionen:

int func3(); 
int func4(); 

jetzt in diesem Code:

A a; 
a.func1(func3()).func2(func4()); 

ist Reihenfolge der Auswertung der Funktionen func3() und func4() definiert?

Nach dieser Antwort Undefined behavior and sequence points einer der Sequenz Punkte sind:

  • an einen Funktionsaufruf (ob oder ob nicht die Funktion inline ist), nach der Auswertung aller Funktionsargumente (falls vorhanden), die dauert Stellen Sie vor der Ausführung von Ausdrücken oder Anweisungen im Funktionskörper (§1.9/17).

Das Gleiche gilt für „Auswertung aller Funktionsargumente“ bedeutet, hat func3() vor func4() aufgerufen werden, die Auswertung von func1() Argumente vor Aufruf von func2() geschehen muss?

+3

Fast ein Duplikat von [this] (http://stackoverflow.com/questions/2129230/cout-order-of-call-to-functions-it-prints/2129242#2129242), in Kürze nein. –

+0

@MattMcNabb Ja, danke, behoben – Slava

+0

Ähnlich wie die kompliziertere Beispiel in [Hat dieser Code aus "Die C++ Programmiersprache" 4. Ausgabe Abschnitt 36.3.6 wohldefiniertes Verhalten?] (Http://stackoverflow.com/q/27158812/1708801), aber ich gebe eine Menge Details in meiner Antwort, die hilfreich sein können, dies zu verstehen. Es gibt eine Reihe von miteinander verbundenen Problemen. –

Antwort

6

Der Kern davon ist, dass in einem Funktionsaufruf X(Y, Z); Bewertung von allen von X, Y, Z sind unbestimmt in Bezug aufeinander sequenziert. Die einzige Sequenzierung ist, dass Y und Z sind sequenziert-vor der Aufruf an die Funktion, die X ausgewertet wird.

Angenommen, wir haben:

typedef void (*fptr)(int, double); 
fptr a(); 
int b(); 
double c(); 

a()(b(), c()); 

Die drei Funktionen a, b, c in beliebiger Reihenfolge aufgerufen werden können. Dies gilt natürlich rekursiv für alle Unterausdrücke.

+0

Wenn "X", "Y" oder "Z" Funktionsaufrufe sind, sind sie unbestimmt sequenziert (mit anderen Worten, können nicht ineinander verschachtelt werden, wie rici gesagt wurde) in Bezug aufeinander, nicht unsequenziert. –

+0

@BenjaminLindley Entschuldigung, ich bekomme immer diese beiden durcheinander –

+1

Nun, Sie waren nicht völlig falsch. In einigen Fällen würden sie nicht sequenziert werden. Zum Beispiel, wenn es sich nicht um Funktionsaufrufe handelt, sondern um integrierte Operationen für primitive Typen. –

3

Nein, func3 und func4 können in jeder Reihenfolge ausgewertet werden (aber nicht interleaved).