#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;    
  }
}
 
				I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKY29uc3QgaW50IE4gPSA1OwoKc3RydWN0IEEKewogIGludCB4OwogIEEoaW50IHgpIDogeCh4KSB7IHN0ZDo6Y291dCA8PCAiQ3JlYXRlZCIgPDwgc3RkOjplbmRsOyB9CiAgQShjb25zdCBBJiByaHMpIDogeChyaHMueCkgeyBzdGQ6OmNvdXQgPDwgIkNvcGllZCIgPDwgc3RkOjplbmRsOyB9Ci8vICBBKGNvbnN0IEEmIHJocykgPSBkZWxldGU7Cn07CgppbnQgbWFrZUVsZW1lbnQoc2l6ZV90IGkpCnsKICByZXR1cm4gaSAqIGk7Cn0KCnRlbXBsYXRlPHNpemVfdC4uLiBJbmRzPgpzdGQ6OmFycmF5PEEsIHNpemVvZi4uLihJbmRzKT4gbWFrZUFycmF5SW1wbChzdGQ6OmludGVnZXJfc2VxdWVuY2U8c2l6ZV90LCBJbmRzLi4uPikKewogIHJldHVybiB7IG1ha2VFbGVtZW50KEluZHMpLi4uIH07Cn0KCnN0ZDo6YXJyYXk8QSwgTj4gbWFrZUFycmF5KCkKewogIHJldHVybiBtYWtlQXJyYXlJbXBsKHN0ZDo6bWFrZV9pbmRleF9zZXF1ZW5jZTxOPnt9KTsKfQoKaW50IG1haW4oKSAKewogIGNvbnN0IHN0ZDo6YXJyYXk8QSwgTj4gYXJyID0gbWFrZUFycmF5KCk7CgogIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGFycikKICB7CiAgICBzdGQ6OmNvdXQgPDwgaXRlbS54IDw8IHN0ZDo6ZW5kbDsgICAgCiAgfQp9Cg==