https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110167
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- The "obvious" alternative impl using a lambda expression is even slower: template<unsigned long N> struct array { int data[N]; }; template<unsigned long...> struct seq { }; #ifndef USE_LAMBDA template<unsigned long... Idx> array<sizeof...(Idx)> to_array_impl(int (&a)[sizeof...(Idx)], seq<Idx...>) { return {{a[Idx]...}}; } #endif template<unsigned long N> array<N> to_array(int (&a)[N]) { #ifndef USE_LAMBDA return to_array_impl(a, seq<__integer_pack(N)...>{}); #else return [&a]<unsigned long... I>(seq<I...>) { return array<N>{{ a[I]... }}; }(seq<__integer_pack(N)...>{}); #endif } constexpr int S = 2000; int f[S]; array<S> g(void) { return to_array(f); }