#include <iostream>
#include <vector>
#include <tr1/functional>

class foo {
  private:
    int val;
    foo() {}
    foo(int v) : val(v) {}
  public:
    static foo create(int v) { return foo(v); }
    int value() const { return val; }
};

class bar {
  private:
    int val;
    bar(const bar&) {}
  public:
    bar() {}
    bar(int v) : val(v) {}
    int value() const { return val; }
    void value(int v) { val = v; }
};

class baz {
  private:
    int val;
    baz() {}
    baz(int v) : val(v) {}
    baz(const baz&) {}
  public:
    int value() const { return val; }
    static baz create(int v) { return baz(v); }
};

int main()
{
  using namespace std;
  {
    vector<foo> v;
    v.push_back(foo::create(1));
    cout << v[0].value() << endl;
  }

  {
    vector<tr1::reference_wrapper<bar> > v;
    bar x(2);
    v.push_back(tr1::ref(x));
    bar& y = v[0];
    cout << v[0].get().value();
    y.value(3);
    cout << ' ' << v[0].get().value() << ' ' << x.value() << endl;
  }

  {
    vector<tr1::reference_wrapper<const baz> > v;
    const baz& x = baz::create(4);
    v.push_back(tr1::ref(x));
    const baz& y = v[0];
    cout << y.value() << ' ' << v[0].get().value() << endl;
  }

  return 0;
}