Чтобы избежать рекурсивного программирования шаблонов, я полагаюсь на короткую оценку результата лямбда-выражений в сочетании с логическим && с использованием выражения свертки. Безопасно ли это делать, или компилятор оптимизирует выражение, потому что оно не используется, даже если оно имеет побочные эффекты?
Например, рассмотрим следующий код:
Код: Выделить всё
#include
#include
template
int count_leading_good(Ts &&...ts) {
int N{0};
([&](auto &&t) -> bool {
if (t.good) {
N += 1;
return true;
}
return false;
}(std::forward(ts)) && ...);
return N;
}
struct A {
bool good{true};
};
struct B {
bool good{false};
};
int main(int argc, char *argv[]) {
assert(count_leading_good(A{}, A{}, A{}, B{}, A{}) == 3);
}
Гарантируется ли, что утверждение никогда не даст сбоя, т. е. что выражение свертки никогда не будет оптимизировано для каких-либо флагов компиляции? Есть ли какое-то правило C++, которое гарантирует это? Это не значит, что результат логического && не используется.
Подробнее здесь:
https://stackoverflow.com/questions/797 ... de-effects