Является ли & = гарантировано вести себя как гипотетический && = оператор?

Иногда я хотел бы сделать

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();

Это кажется столь же ясным (по крайней мере отформатированным как это), и избегает любой необходимости &&=.