scope-lite icon indicating copy to clipboard operation
scope-lite copied to clipboard

constexpr scope guards

Open Morwenn opened this issue 2 years ago • 2 comments

Hi, it occurred to me recently that it is easily possible to make scope guards constexpr in C++20 by making uncaught_exceptions constexpr itself. The following function should be very simple yet sufficient:

constexpr int uncaught_exceptions() noexcept
{
    if (std::is_constant_evaluated()) {
        return 0;
    } else {
        return std::uncaught_exceptions();
    }
}

At constexpr time, there shouldn't be any exception in flight at any moment since throw terminates the compilation, therefore we can safely return 0, it will always be true.

I know that basing scope guards on uncaught_exceptions() is fragile because of known issues with coroutines, but the proposed change is arguably rather useful, is a strict improvement to the existing implementation, and makes it work at compile-time, a context where it will correctly work even in the presence of coroutines.

Anyway, thanks for the library :)

Morwenn avatar Aug 14 '22 22:08 Morwenn

Thanks @Morwenn, for your interesting observation. I'll try and incorporate it.

martinmoene avatar Aug 15 '22 08:08 martinmoene

Todo:

  • [x] add C++20 to GitHub Actions builds (msvc already includes c++latest).
  • [ ] make unique_resource constexpr.

martinmoene avatar Aug 17 '22 13:08 martinmoene