2014-11-15 4 views
7

Pre-C++ 11, мы знаем, что короткое замыкание и порядок оценки необходимы для оператора && из:Безопасная оценка короткого замыкания в C++ 11

1.9.18

при оценке следующих выражений

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

с помощью встроенного в значении операторы в этих выражениях, , есть точка последовательности после оценки первого выражения (12).

Но последовательность Баллов больше не существует в C++ 11, так, где это стандартная часть, которая говорит:

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

безопасно?

+2

[expr.log.and]/2 – chris

+1

Точки последовательности не гарантируют короткое замыкание в любом случае. (Очевидно, что 'operator,' не может быть короткого замыкания.) Вам все еще нужна фактическая спецификация оператора, чтобы гарантировать это. –

ответ

14

[expr.log.and]

В && оператор группы влево-вправо. Операнды преобразуются в контекстном контексте в bool (пункт 4). Результат равен true, если оба операнда истинны и false в противном случае. В отличие от &, && гарантии слева направо Оценка: второй операнд не оценивается, если первый операнд является ложным.

Результат bool. Если второе выражение оценивается, каждое вычисление значения и связанный с ним побочный эффект с первым выражением секвенируются перед каждым вычислением значения и побочным эффектом, связанным с вторым выражением .

 Смежные вопросы

  • Нет связанных вопросов^_^