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