What is it, naokirin?

Const auto_ptrイディオム

ちょっと前に書いたC++0xの機能(shared_ptr/スマートポインタ)に出てきたConst auto_ptrについてまとめてみることにしました。

調べればすぐにわかることですし考えてもわかることかもしれませんが、auto_ptrをconstで宣言することで所有権の移譲を防止するすることができます。このイディオムをConst auto_ptrと言います。

auto_ptrの(良くも悪くも)欠点として、破壊的コピーが存在します。つまりコピー元をを破壊して所有権を移譲することです。(このあたりの例もC++0xの機能(shared_ptr/スマートポインタ)の記事を参照)

この破壊的コピーをして所有権を移譲するということをさせたくない場合、Const auto_ptrイディオムを使えば良いというわけです。実際にauto_ptrはコピーを行う際に所有権移動コンストラクタを呼び出していて、非const参照を受け取るようになっています。そこへconstなauto_ptrを束縛することはできません。つまり、コピーを仕様とした時点でコンパイルエラーが発生するわけです。

const auto_ptr <Type> ptr1 (new Type());
auto_ptr <Type> ptr2 (ptr1); /* コンパイルエラー */



ただしこれは万能ではなく、たとえばconst auto_ptrを持つメンバが存在すれば、コピーコンストラクタはデフォルトでは生成できないことになります(それは簡単にいうとconst auto_ptrはコピーを行うことができないからです)。
これは解決策として、仮想コンストラクタか、Boost::scoped_ptrや(所有権移動の防止ではなく、破壊的コピーの防止という意味でなら)C++0xのunique_ptrを用いることが考えられます。

これ書いてて思った。

内容的にはMore C++ Idioms見た方が早いし、C++0x出たら「auto_ptrなんて残念な子はいらない」とかなるんだよね・・・。