Являются ли выражения сгиба короткими замыканиями? - PullRequest
0 голосов
/ 01 мая 2018

В C ++ 17 могут ли выражения сгиба подвергаться короткому замыканию при использовании с && или || в качестве их оператора? Если да, то где это указано?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Хотя @ aschepler's answer является особенно правильным, я бы хотел повторить жизненный урок, который я поделился относительно другого тонкого технического момента (порядок уничтожения кортежей) :

Если вы можете сформулировать для нескольких альтернатив разумный аргумент о том, почему эта альтернатива должна быть той, которая предусмотрена стандартом, - тогда вы не должны предполагать, что какой-либо из них является обязательным (даже если один из них оказывается).

В контексте выражений сгиба и логики короткого замыкания - уже достаточно сложно читать кодированный шаблон с вариабельной кодировкой, поэтому я постарался бы избавить читателя моего кода от головокружения относительно того, происходит ли короткое замыкание сгиба. ..

Если вы не можете избежать написания сгибов and и or, по крайней мере, будьте щедры с комментариями относительно поведения короткого замыкания.

0 голосов
/ 01 мая 2018

Да, сложите выражения, используя && или ||, поскольку оператор может закорачивать, при условии обычного предостережения, которое случается для встроенного значения, но не для перегруженной функции оператора.

Значение выражения сгиба определено в [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))) для двоичного правого сгиба.

В каждом случае op является оператором сгиба , ....

Поскольку создание выражения для сгиба происходит в терминах выражения, содержащего оператор, применяются все обычные правила для оператора, включая разрешение перегрузки, порядок вычисления и короткое замыкание при использовании встроенного оператора.

...