Qual è la differenza tra obj Object (args ...) e Object obj {args ...}? e perché Scott lo dice.
La differenza è che nel primo caso, l'ordine di valutazione degli argomenti è non in sequenza (cioè non specificato), ma in quest'ultimo caso, l'ordine è da sinistra a destra (cioè in cui appaiono).
Il testo che segue da $ 5.2.2/8 [expr.call] (n3690) si occupa di Object(args...)
forma:
Le valutazioni dell'espressione Postfix e degli argomenti sono tutti non in sequenza uno rispetto un altro. Tutti gli effetti collaterali delle valutazioni degli argomenti sono sequenziati prima dell'inserimento della funzione (vedere 1.9).
E il testo da $ 8.5.4/4 [dcl.init.list] (n3690) si occupa di Object{args...}
forma:
All'interno di inizializzazione-list di a-init-list rinforzato, il Le clausole di inizializzazione , comprese quelle risultanti dalle espansioni del pacchetto (14.5.3), sono valutate nell'ordine in cui appaiono. Vale a dire, ogni calcolo del valore ed e ff etto laterale associato a una data clausola inizializzatore viene sequenziato prima di ogni calcolo del valore ed ef fetto etto associato a qualsiasi clausola inizializzatore che lo segue in l'elenco separato da virgola dell'elenco inizializzatore. [Nota: questo ordinamento di valutazione è valido indipendentemente dalla semantica dell'inizializzazione ; ad esempio, si applica quando gli elementi dell'elenco inizializzatore vengono interpretati come argomenti di una chiamata del costruttore, anche se normalmente non vi sono vincoli di sequenziamento negli argomenti di una chiamata.- nota end]
Bene che significa che questo:
int f() { static int i = 10; return ++i; } //increment the static int!
Object obj(f(), f()); //is it obj(11,12) or obj(12,11)? Unspecified.
Object obj{f(), f()}; //it is obj(11,12). Guaranteed.
noti che GCC (4.7.0 and 4.7.2) have a bug because of which {}
form doesn't work the way it should. Non sono sicuro se è stato risolto nella versione corrente.
Spero che questo aiuti.
possibile duplicato di [Come usare C++ 11 sintassi di inizializzazione uniforme?] (Http://stackoverflow.com/questions/7612075/how-to-use-c11-uniform-initialization-syntax) –
@MattMcNabb, quella domanda richiede HOW, questa domanda richiede PERCHÉ. – xmllmx
Questa domanda non chiede "PERCHÉ", e l'altra domanda riguarda l'inizializzazione uniforme. –