#include <iostream>
#include <algorithm>
 
struct nur_zum_testen_t {} nur_zum_testen;
 
template <typename T>
class List {
  T * items;
  int size, capacity;
 public:
  List(const List& list);
 ~List() { delete[] items; }
 
  List(nur_zum_testen_t, T *items, int size, int capacity)
    : items(items), size(size), capacity(capacity) {}
};
 
template <class T>
List<T>::List(const List& list) :
items(new T[list.capacity]),
size(list.size),
capacity(list.capacity)
{
  std::copy( list.items, list.items + size, items );
}
 
int instances;
struct doofsinn {
  doofsinn() { ++instances; }
  ~doofsinn() { --instances; }
  doofsinn& operator=(doofsinn const&) {
    static int doofsinn_counter = 0;
    if (++doofsinn_counter % 5 == 0)
      throw "Sone";
  }
};
 
int main()
{
  {
    List<doofsinn> l(nur_zum_testen, new doofsinn[10] (), 10, 10);
    try { List<doofsinn> l2(l); } catch(...) {}
  }
  std::cout << instances << " instances still out there ...\n";
}
