Недавно я наткнулся на фрагмент кода, который выглядел так:
bool MyClass::do_work()
{
bool success = true;
for (auto const& worker : m_workers)
{
success &= worker.do_work(); // worker.do_work() returns a bool
}
return success;
}
Если я правильно понимаю, функция возвращает true
, если все работники возвращают true
, и возвращает false
, если какой-либо работник возвращает false. Тем не менее, он всегда оценивает всех работников (что желательно). Оценка короткого замыкания не требуется, поскольку использовался побитовый оператор &=
, а не логический оператор &&
.
Это поведение гарантировано? Точнее, гарантируется ли, что поразрядное &
всегда вычисляет оба операнда, даже если они имеют тип bool
? Я встречал много ответов SO относительно гарантированной оценки короткого замыкания для &&
, но ни один из них не утверждал, что есть гарантированная оценка без короткого замыкания для &
.
Если это поведение гарантировано, это хороший стиль программирования? Мне потребовалось больше, чем быстрый взгляд, чтобы понять функцию, потому что я раньше не видел этот стиль, и сначала я был озадачен, была ли включена оценка короткого замыкания или нет.
Есть ли лучшая альтернатива, чем следующая?
bool MyClass::do_work()
{
bool success = true;
for (auto const& worker : m_workers)
{
if (!worker.do_work())
{
success = false;
}
}
return success;
}