適当にauto_ptrを実装する

#include <iostream>
#include <string>

using namespace std;

template<class T>
class AutoPtr {
  T *p_;
public:
  AutoPtr(T *p) {
    cout << "new:" << this << endl;
    p_ = p;
  }

  ~AutoPtr() {
    cout << "delete:" << this << endl;

    if (p_) {
      cout << "!!delete object!!" << endl;
      delete p_;
    }
  }

  AutoPtr(AutoPtr<T>& other) {
    cout << "copy:" << this << " <- " << &other << endl;
    this->p_ = other.p_;
    other.p_ = 0;
  }

  T operator *() {
    return *(this->p_);
  }
};

AutoPtr<string> create() {
  string *str = new string("hello, AutoPtr!");
  AutoPtr<string> p = AutoPtr<string>(str);
  cout << *p << "(in create)" << endl;
  return p;
}

int main() {
  cout << "begin" << endl;

  {
    AutoPtr<string> str = create();
    cout << *str << endl;
  }

  cout << "end" << endl;
}


begin
new:0013FE24
hello, AutoPtr!(in create)
copy:0013FF54 <- 0013FE24
delete:0013FE24
hello, AutoPtr!
delete:0013FF54
!!delete object!!
end
続行するには何かキーを押してください . . .

はじめは↓の様にしてたら、最適化が働いて、コピーコンストラクタが動かなかった。

AutoPtr<string> create() {
  string *str = new string("hello, AutoPtr!");
  return AutoPtr<string>(str);
}