Неиспользованный результат короткого замыкания с побочными эффектами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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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