ユーザ定義されたデストラクタを持つクラスのコピー自動生成が deprecated に

C++0xに素晴らしい変更が来たようです:
本の虫: C++0xにすごい変更が来た


この変更により、初心者にありがちな間違いである、

class my_string
{
  char* buf;
 public:
  my_string( char const* s ) {
    std::size_t const n = std::strlen(s);
    buf = new char[n+1];
    std::strcpy( buf, s );
  }
  ~my_string() { delete [] buf; }
  // コピーコンストラクタ/代入演算子を書き忘れた

  // ...
};

int main() {
  my_string s = "hoge", t = s;  // コンパイル通る
  // 二重 delete !
}

のようなコードに対して、コンパイル時に Warning を出すことが出来るようになります。


勿論、ある程度 C++ に精通した人は、いちいちデストラクタを明示的に定義するよりも、
スマートポインタを使ってデストラクタを書かないようにする方を好むでしょう。
その点でも、今回の変更は、
生ポインタを使わずにスマートポインタを使う、という良い習慣を、
「生ポインタを使ってデストラクタを明示的に書いたコード」にかかる手間を増やす*1
ことにより自然に定着させることにも繋がる、素晴らしいものだと思った次第。


…で、規格制定はまだなんですかね?

*1:警告を避けるためには明示的にコピーを殺す、あるいはキチンとしたコピーを定義しなければいけなくなるので、コードは長くなる