#include <cstdlib>   // for EXIT_SUCCESS
#include <iostream>  // for std::cout, std::endl
#include <memory>    // for std::shared_ptr
#include <vector>    // for std::vector

using std::shared_ptr;
using std::vector;

int main(int argc, char **argv) {
  vector<shared_ptr<int> > vec;

  vec.push_back(shared_ptr<int>(new int(9)));
  vec.push_back(shared_ptr<int>(new int(5)));
  vec.push_back(shared_ptr<int>(new int(7)));

  // z is (a reference to) the (int pointed to by the shared_ptr
  // in vec[1])
  int &z = *vec[1];
  std::cout << "z is: " << z << std::endl;

  // works, since shared_ptrs can be copied
  shared_ptr<int> copied = vec[1];
  std::cout << "*copied: " << *copied << std::endl;

  // works, but now vec[1] has a null pointer.
  shared_ptr<int> moved = std::move(vec[1]);
  std::cout << "*moved: " << *moved << std::endl;
  std::cout << "vec[1].get(): " << vec[1].get() << std::endl;

  return EXIT_SUCCESS;
}