#include <array>
#include <utility>


template<typename T, size_t N, size_t... I>
constexpr std::array<T, N+1> append_helper(const std::array<T, N>& arr, const T& elem, std::index_sequence<I...>)
{
    return std::array<T, N+1>{ arr[I]..., elem };
}

template<typename T, size_t N>
constexpr std::array<T, N+1> append(const std::array<T, N>& arr, const T& elem)
{
    return append_helper(arr, elem, std::make_index_sequence<N>{});
}


int main()
{
    constexpr std::array<int, 3> a1{3, 2, 1};
    constexpr auto a2 = append(a1, 0);
    constexpr int i = a2[3];
    
    return i;
}