2015-07-30 12 views
8

Powiedzmy mamy klasę A:Zamówienie ewaluacji w wywołaniu łańcucha w C++

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

i 2 standlone funkcje:

int func3(); 
int func4(); 

teraz w tym kodzie:

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

jest kolejność ewaluacji funkcji zdefiniowano jako func3() i ?

Według tej odpowiedzi Undefined behavior and sequence points jednym z punktów sekwencji są:

  • w wywołaniu funkcji (czy funkcja jest inline), po dokonaniu oceny wszystkich argumentów funkcji (jeśli w ogóle), które trwa miejsce przed wykonaniem jakichkolwiek wyrażeń lub instrukcji w treści funkcji (§1.9/17).

Więc nie „ocena wszystkich argumentów funkcji” oznaczają, func3() musi zostać wywołana przed func4() jak ocena func1() argumentów musi nastąpić przed wywołaniem func2()?

+3

Prawie duplikat [tego] (http://stackoverflow.com/questions/2129230/cout-order-of-all-to-functions-it-prints/2129242#2129242), w skrócie nie. –

+0

@MattMcNabb Tak, dziękuję, naprawiono – Slava

+0

Podobny do bardziej skomplikowanego przykładowego w [Czy ten kod z "The C++ Programming Language" 4. wydanie sekcja 36.3.6 ma dobrze zdefiniowane zachowanie?] (Http://stackoverflow.com/q/27158812/1708801), ale w mojej odpowiedzi podaję wiele szczegółów, które mogą być pomocne w zrozumieniu tego. Istnieje wiele powiązanych ze sobą problemów. –

Odpowiedz

6

Istotą jest to, że w wywołaniu funkcji, X(Y, Z); ocena wszystkich z X, Y, Z jest w sposób nieokreślony sekwencjonowana względem siebie. Jedynym sekwencją jest to, że Y izsekwencjonowano przed wywołaniem funkcji, dla której oceniano.

Załóżmy, że mamy:

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

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

Trzy funkcje a, b, c może być wywołana w dowolnej kolejności. Oczywiście wszystko to odnosi się rekursywnie do dowolnych wyrażeń podrzędnych.

+0

Jeśli 'X',' Y' lub 'Z' są funkcjami, są one w nieokreślony sposób zsekwencjonowane (innymi słowy, nie mogą być przeplatane, jak powiedziała rici), w stosunku do siebie nawzajem, a nie bez konsekwencji. –

+0

@BenjaminLindley przepraszam, zawsze mam te dwa pomieszane –

+1

Cóż, nie były całkowicie błędne. W niektórych przypadkach byłyby one niesekwencjonowane. Na przykład, jeśli nie są wywołaniami funkcji, ale wbudowanymi operacjami na typach pierwotnych. –

3

Nie, func3 i func4 mogą być oceniane w dowolnej kolejności (ale bez przeplatania).