#include <array>
#include <utility>
#include <iostream>

const int N = 5;

struct A
{
  int x;
  A(int x) : x(x) { std::cout << "Created" << std::endl; }
  A(const A& rhs) : x(rhs.x) { std::cout << "Copied" << std::endl; }
//  A(const A& rhs) = delete;
};

int makeElement(size_t i)
{
  return i * i;
}

template<size_t... Inds>
std::array<A, sizeof...(Inds)> makeArrayImpl(std::integer_sequence<size_t, Inds...>)
{
  return { makeElement(Inds)... };
}

std::array<A, N> makeArray()
{
  return makeArrayImpl(std::make_index_sequence<N>{});
}

int main() 
{
  const std::array<A, N> arr = makeArray();

  for (const auto& item : arr)
  {
    std::cout << item.x << std::endl;    
  }
}
