Skip to content

constexpr scope guards #5

@Morwenn

Description

@Morwenn

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 :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions