В C ++ 17, являются ли сложенные выражения короткое замыкание при использовании с &&
или же ||
как их оператор? Если да, то где это указано?
Да, сложить выражения с помощью &&
или же ||
поскольку оператор может закорачивать, при условии обычного предостережения, что это происходит для встроенного значения, но не для перегруженной операторской функции.
Значение выражения сгиба определено в [temp.variadic] / 9:
Создание экземпляра складчато-выражение производит:
((E_1
опE_2)
оп …)
опE_N
для одинарной левой складки,
E_1
оп(
… оп(E_N_minus_1
опE_N))
для одинарной правой складки,
(((E
опE_1)
опE_2)
оп …)
опE_N
для двоичной левой складки, и
E_1
оп(
… оп(E_N_minus_1
оп(E_N
опE)))
для двоичного правильного сгиба.В каждом случае, оп это складчато-оператор,….
Поскольку создание выражения для сгиба происходит в терминах выражения, содержащего оператор, применяются все обычные правила для оператора, включая разрешение перегрузки, порядок вычисления и короткое замыкание при использовании встроенного оператора.
В то время как @ aschepler’s ответ это особенно правильный, я хотел бы повторить жизненный урок, который я поделился относительно другого тонкого технического момента (порядок уничтожения кортежей):
Если вы можете сформулировать для нескольких альтернатив разумный аргумент о том, почему эта альтернатива должна быть той, которая предусмотрена стандартом, — тогда вы не должны предполагать, что какой-либо из них является обязательным (даже если один из них оказывается).
В контексте выражений сгиба и логики короткого замыкания — уже достаточно сложно читать кодированные переменные коды, поэтому я попытался бы избавить читателя моего кода от головокружения относительно того, происходит ли короткое замыкание сгиба …
Если вы не можете избежать написания and
а также or
складки, по крайней мере, быть щедрым с комментариями относительно поведения короткого замыкания.