2015-10-22 11 views
8

Dato questa dichiarazione (che, come nota a margine, non è il mio stile di programmazione preferito)If-Statement in C++ con corpo vuoto: la condizione è garantita da valutare?

if(doSomething()) {} 

fa garanzia 'il C++ Standard' che la funzione si chiama? (il suo valore di ritorno ha alcun effetto sul percorso di esecuzione, in modo che il compilatore può seguire le idee di valutazione rapida e ottimizzare lontano.)

+2

Sì, lo standard lo garantisce e un ottimizzatore non è autorizzato a modificare l'effetto semantico. –

+0

Puoi semplicemente scrivere '(void) doSomething();' se vuoi scartare esplicitamente il valore restituito. – Useless

risposta

8

Non c'è operatore cortocircuito coinvolti, in modo che il funzionamento è garantito da chiamare se non può essere ottimizzato via senza rimuovere gli effetti collaterali. Citando lo standard C++ 11:

[...] conformi implementazioni sono tenuti a emulare (solo) il comportamento osservabile della macchina astratta come spiegato seguito.

Questa disposizione viene spesso chiamata la “come-se” regola [...] un'implementazione reale non necessario valutare parte di un'espressione se si può dedurre che il suo valore non viene utilizzato e che non vengono prodotti effetti collaterali che influenzano il comportamento osservabile del programma.

Quindi, qualcosa di simile a

int doSomething() { return 1; } 

potrebbe essere ottimizzato via, ma

int doSomething() { std::cout << "d\n"; return 1; } 

non è permesso.

Inoltre, dal C++ 11, è possibile scrivere funzioni più sofisticate e comunque valutarle in fase di compilazione utilizzando constexpr.

Problemi correlati