2015-07-30 18 views
8

Diciamo che abbiamo classe A:Ordine di valutazione in catena di invocazione in C++

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

e 2 standlone funzioni:

int func3(); 
int func4(); 

ora in questo codice:

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

è È stato definito l'ordine di valutazione delle funzioni func3() e func4()?

Secondo questa risposta Undefined behavior and sequence points uno dei punti di sequenza sono:

  • ad una chiamata di funzione (se la funzione è in linea), dopo la valutazione di tutti gli argomenti di funzione (eventuali) prende posizionare prima dell'esecuzione di qualsiasi espressione o istruzione nel corpo della funzione (§1.9/17).

Così fa "la valutazione di tutti gli argomenti di funzione" significa, func3() deve essere chiamato prima func4() la valutazione di func1() argomenti deve avvenire prima della chiamata del func2()?

+3

Quasi un duplicato di [questo] (http://stackoverflow.com/questions/2129230/cout-order-of-call-to-functions-it-prints/2129242#2129242), in breve n. –

+0

@MattMcNabb sì, grazie, corretto – Slava

+0

Simile al più complicato esemplificato in [Questo codice da "The C++ Programming Language" nella quarta sezione 36.3.6 ha un comportamento ben definito?] (Http://stackoverflow.com/q/27158812/1708801) ma nella mia risposta fornisco molti dettagli che potrebbero essere utili per capirlo. Ci sono un sacco di problemi interconnessi. –

risposta

6

Il primo è che in una chiamata di funzione, X(Y, Z); la valutazione di tutti X, Y, Z sono sequenzialmente indeterminati l'uno rispetto all'altro. L'unico sequenziamento è che Y e Z sono sequenziati - prima della la chiamata alla funzione a cui è stato valutato X.

Supponiamo di avere:

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

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

Le tre funzioni a, b, c possono essere chiamati in qualsiasi ordine. Naturalmente tutto ciò si applica in modo ricorsivo a qualsiasi sottoespressione.

+0

Se 'X',' Y' o 'Z' sono chiamate di funzione, esse sono sequenzialmente indeterminate (in altre parole, non possono essere intercalate, come detto rici) l'una rispetto all'altra, non annullate. –

+0

@BenjaminLindley scusate, ho sempre messo in confusione quei due –

+1

Bene, non avevate completamente torto. In alcuni casi, sarebbero stati rimossi. Ad esempio, se non sono chiamate di funzione, ma operazioni incorporate su tipi primitivi. –

3

No, func3 e func4 possono essere valutati in entrambi gli ordini (ma non con interfoliazione).