#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


      struct C {
        int i_=0;
        C() {}
        C(int i) : i_( i ) {}
        C( const C& other) :i_(other.i_) {
          std::cout << "A copy construction was made." << i_<<std::endl;
        }
        C& operator=( const C& other) {
          i_= other.i_ ;
          std::cout << "A copy assign was made."<< i_<<std::endl;
          return *this;
        }
        C( C&& other ) noexcept :i_( std::move(other.i_)) {
          std::cout << "A move construction was made." << i_ << std::endl;
        }
        C& operator=( C&& other ) noexcept {
          i_ = std::move(other.i_);
          std::cout << "A move assign was made." << i_ << std::endl;
          return *this;
        }
      };
      
int main() {
    //auto vec2 = std::vector<C>{{1},{2},{3},{4},{5}};
    auto vec2 = std::vector<C>{std::initializer_list<int>{1,2,3,4,5}};

	cout << "reversing\n";
	std::reverse(vec2.begin(),vec2.end());
	return 0;
}