nullを許容しないスマポ

template<typename T>
struct smart_ptr {
  ...
  explicit smart_ptr(T * ptr) : ptr_(ptr) {}
  template<typename U>
  smart_ptr(smart_ptr<U> const & other) : ptr_(other.get()) {}
  smart_ptr & operator=(T * ptr) { ptr_ = ptr; ... return *this; }
  template<typename U>
  smart_ptr & operator=(smart_ptr<U> const & other) { ptr_ = other.get(); ... return *this; }
private:
  explicit smart_ptr(int);
  smart_ptr & operator=(int);
};

うーんsmart_ptr ptr(0);はコンパイルではじけるけどそれだけだし、全然意味ないなぁ…結局runtimeでのチェックは必要か。まぁtemplate smart_ptr make_smart_ptr(Args... args);で生成するようにして生ポインタからの構築及び生ポインタの代入を定義しなければそれで世界は守られるし、こんな小細工いらんか。