2014-11-15 11 views
7

przygotowujące do C++ 11 wiemy, że zwarcie i porządek oceny są wymagane dla operatora && powodu:Bezpieczne ocena zwarcie w C++ 11

1.9.18

w ocenie następujących wyrażeń

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

wykorzystaniem wbudowanego w rozumieniu operatory w tych wyrażeniach, , jest punkt sekwencji po ocenie pierwszego wyrażenia (12).

Ale sekwencja punkty już nie istnieją w C++ 11, więc gdzie jest standardową częścią, która mówi:

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

jest bezpieczne?

+2

[expr.log.and]/2 – chris

+1

Punkty sekwencyjne nie gwarantują żadnych zwarć. (Oczywiście 'operator,' nie może ewentualnie zwarcia.) Nadal potrzebujesz rzeczywistej specyfikacji operatora, aby to zagwarantować. –

Odpowiedz

14

[expr.log.and]

W && grupy operatora od lewej do prawej. Operandy są konwertowane kontekstowo na bool (Rozdział 4). Wynik jest prawdziwy, jeśli oba operandy mają wartość true, a false w przeciwnym wypadku. W przeciwieństwie do &, && gwarantuje ocenę od lewej do prawej: : drugi argument nie jest oceniany, jeśli pierwszy operand jest fałszywy.

Wynikiem jest bool. Jeśli oceniane jest drugie wyrażenie, każde obliczenie wartości i skutek uboczny związane z pierwszym wyrażeniem są zsekwencjonowane przed każdym wyliczeniem wartości i efektem ubocznym związanym z drugim wyrażeniem wartości.