Является ли & = гарантировано вести себя как гипотетический && = оператор?
Иногда я хотел бы сделать
bool success= true;
success &&= dosmthing1();
success &&= dosmthing2();
success &&= dosmthing3();
if (success)
Давайте проигнорируем, что я могу использовать исключения...
мой вопрос в том, гарантирован ли он стандартом С++, что &=
будет вести себя как несуществующий &&=
для моего варианта использования?
...
EDIT: сделать smthing-s return bool
Ответы
Ответ 1
Это зависит от того, как вы ожидаете, что &&=
будет работать. Если вы хотите, чтобы x &&= y();
был эквивалентен x = x && y();
, тогда нет, потому что в этом выражении y()
не вызывается, если x
начинается как false, но в x &= y();
он будет.
Если вы не ожидаете, что это будет короткое замыкание, и все ваше выражение действительно имеет тип bool
(а не что-то, конвертируемое в bool
, например указатели, целые числа или определенные пользователем объекты), оно работает. Тем не менее, существует множество ограничений.
Ответ 2
Нет, и является поразменным и, && является булевым и. Если dosmthing * возвращает что-то отличное от 1 или 0, результаты будут разными.
Ответ 3
Нет; это не короткое замыкание.
bool x = false;
x &= (cout << "You shouldn't see me!");
Ответ 4
Они совершенно разные. В этом случае короткий
Циркуляция &&
кажется важной: если dosmthing1()
возвращается
false, dosmthing2
и dosmthing3
не будут вызываться, если вы
используйте &&
. Они будут вызываться, если вы используете &
.
В этом конкретном случае, почему бы просто не написать:
success = dosmthing1()
&& dosmthing2()
&& dosmthing3();
Это кажется столь же ясным (по крайней мере отформатированным как это), и
избегает любой необходимости &&=
.