Неиспользованный результат короткого замыкания с побочными эффектамиC++

Программы на C++. Форум разработчиков
Anonymous
Неиспользованный результат короткого замыкания с побочными эффектами

Сообщение Anonymous »

Чтобы избежать рекурсивного программирования шаблонов, я полагаюсь на короткую оценку результата лямбда-выражений в сочетании с логическим && с использованием выражения свертки. Безопасно ли это делать, или компилятор оптимизирует выражение, потому что оно не используется, даже если оно имеет побочные эффекты?
Например, рассмотрим следующий код:

Код: Выделить всё

#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

Вернуться в «C++»