Условие запрета в C++
Условный noexcept записывают как
noexcept(условие) и вычисляет
запрет на этапе компиляции.
Часто условие строят через noexcept(expr)
для вложенного вызова: обертка наследует
поведение переданного действия.
Запишем шаблонную обертку с одним
условным запретом:
#include <iostream>
template<typename F>
void run_once(F action) noexcept(noexcept(action())) {
action();
}
int main() {
run_once([]() noexcept {
std::cout << "ok\n";
});
return 0;
}
Для лямбды без throw условие истинно,
поэтому run_once тоже помечается
как не бросающая. Если бы действие могло
бросать, запрет у обертки снялся бы
автоматически.
Объявите шаблон invoke_twice(F fn)
с noexcept(noexcept(fn())), дважды
вызывающий fn. Передайте лямбду
без исключений и выведите "done".