2015-07-24 6 views
5

È ampiamente noto (sebbene non ampiamente> <) che C e C++ non specificano l'ordine in cui vengono valutati i parametri di una funzione. Cioè, i due puts() s indicati possono verificarsi in qualsiasi ordine, come scelta compilatore arbitraria:La valutazione di una chiamata di funzione è "questo" in un ordine non specificato relativamente ai parametri?

#include <cstdio> 

int Function1() { 
    std::puts("Function1"); 
    return 1; 
} 

int Function2() { 
    std::puts("Function2"); 
    return 2; 
} 

int Add(int x, int y) { 
    return x + y; 
} 

int main() { 
    return Add(Function1(), Function2()); 
} 

Tuttavia, questo si applica anche alla valutazione della this sul lato sinistro del ., .*, -> o ->* operatori? In altre parole, l'ordine dello puts() è inferiore a anche non specificato?

#include <cstdio> 

struct Struct { 
    Struct() { std::puts("Struct::Struct"); } 
    int Member(int x) const { return x * 2; } 
}; 

int Function() { 
    std::puts("Function"); 
    return 14; 
} 

int main() { 
    return Struct().Member(Function()); 
} 
+0

Secondo http://en.cppreference.com/w/cpp/language/eval_order, l'ordine è _unspecified_ in entrambi i casi. –

risposta

5
Struct().Member(Function()) 

Questa è una chiamata di funzione in cui il suffisso-espressione è Struct().Member e l'argomento è Function(). In generale, in una chiamata di funzione, la valutazione dell'espressione postfissa viene annullata rispetto alla valutazione degli argomenti.

Pertanto, l'ordine delle chiamate puts non è specificato.

È completamente irrilevante che la funzione sia una funzione membro non statico.

Problemi correlati