2014-11-15 16 views
7

Pre-C++ 11 sappiamo che cortocircuito e l'ordine di valutazione sono necessari per l'operatore && a causa di:sicura di valutazione di corto circuito in C++ 11

1.9.18

nella valutazione dei seguenti espressioni

a && b 
a || b 
a ? b : c 
a , b 

utilizzando il built-in di significato gli operatori in queste espressioni, , c'è un punto di sequenza dopo la valutazione della prima espressione (12).

Ma sequenza di punti non esistono più in C++ 11, quindi dove è la parte standard che dice:

if (ptr && ptr->do_something()) 
{ 
} 

è sicuro?

+2

[expr.log.and]/2 – chris

+1

I punti di sequenza non garantiscono comunque un cortocircuito. (Ovviamente l'operatore ',' non può eventualmente corto circuito.) È comunque necessario disporre delle specifiche dell'operatore per garantirlo. –

risposta

14

[expr.log.and]

I && gruppi di operatori da sinistra a destra. Gli operandi vengono entrambi convertiti contestualmente in bool (clausola 4). Il risultato è true se entrambi gli operandi sono veri e falsi altrimenti. A differenza di &, && garantisce la valutazione da sinistra a destra : il secondo operando non viene valutato se il primo operando è falso.

Il risultato è un bool. Se viene valutata la seconda espressione, ogni calcolo del valore ed effetto collaterale associato a con la prima espressione viene sequenziato prima di ogni calcolo del valore ed effetto collaterale associato alla seconda espressione .