2014-11-15 18 views
7

Pre-C++ 11 wissen wir, dass ein Kurzschluss und Auswertung, um für Betreiber && wegen erforderlich sind:Sicheres Kurzschlussauswertung in C++ 11

1.9.18

bei der Auswertung der folgenden Ausdrücke

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

mit dem eingebauten in der Bedeutung von die Operatoren in diesen Ausdrücken, gibt es einen Sequenzpunkt nach der Auswertung des ersten Ausdrucks (12).

Aber Sequenzpunkte existieren nicht mehr in C++ 11, also wo ist der Standard-Teil, der sagt:

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

sicher ist?

+2

[expr.log.and]/2 – chris

+1

Die Sequenzpunkte garantieren keinen Kurzschluss. (Offensichtlich kann der "Operator" nicht kurzgeschlossen werden.) Um dies zu gewährleisten, benötigen Sie immer noch die aktuelle Operator-Spezifikation. –

Antwort

14

[expr.log.and]

Die && Betreibergruppen von links nach rechts. Die Operanden werden beide kontextbezogen in bool (Abschnitt 4) konvertiert. Das Ergebnis ist wahr, wenn beide Operanden wahr und falsch sind. Im Gegensatz zu &, && garantiert von links nach rechts Auswertung: der zweite Operand wird nicht ausgewertet, wenn der erste Operand falsch ist.

Das Ergebnis ist ein bool. Wenn der zweite Ausdruck ausgewertet wird, wird jede mit dem ersten Ausdruck verknüpfte Wertberechnung und Nebenwirkung vor jeder Wertberechnung und Nebenwirkung, die dem zweiten Ausdruck zugeordnet ist, sequenziert.