https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119890

            Bug ID: 119890
           Summary: Add `__builtin_structured_binding_size` (useful and
                    for compatibility with Clang)
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vittorio.romeo at outlook dot com
  Target Milestone: ---

Clang 21 supports a new builtin called `__builtin_structured_binding_size(T)`,
that efficiently returns the structured binding size of type `T`. 

This is equivalent to the size of the pack `p` in `auto&& [...p] =
declval<T&>();`. If the argument cannot be decomposed,
`__builtin_structured_binding_size(T)` is not a valid expression
(`__builtin_structured_binding_size` is SFINAE-friendly).

An example from Clang docs:

    template<std::size_t Idx, typename T>
    requires (Idx < __builtin_structured_binding_size(T))
    decltype(auto) constexpr get_binding(T&& obj) {
        auto && [...p] = std::forward<T>(obj);
        return p...[Idx];
    }
    struct S { int a = 0, b = 42; };
    static_assert(__builtin_structured_binding_size(S) == 2);
    static_assert(get_binding<1>(S{}) == 42);

Reply via email to