C++によるWindows開発ではATLとSTLが使えます。ATLがメモリ管理クラス(CComPtr
やCComHeapPtr
)に&
演算子を実装して内部ポインタのポインタ取得を可能にしている一方、STLはスマートポインタ(unique_ptr
やshared_ptr
)に&
演算子を実装していません。STLの方が広く使われているのにどうしてだろうと不思議に思っていたのですが、shared_ptr
もスマートポインタであることを思い出して納得しました。
STLのshared_ptr
は複数のインスタンスが参照カウントを使ってメモリを共有します。これが&
演算子で内部ポインタのポインタを返す場合、あるインスタンスのデータを変更したつもりがメモリを共有する全インスタンスのデータを変更してしまいます。
最初から上記の仕様であれば不都合は生じないと思いますが、shared_ptr
が生のポインタを機能拡張したスマートポインタであることを考えると余分な機能が付きすぎてしまう印象があります。想像ですが、以上のような理由からSTLのスマートポインタは&
演算子による内部ポインタのポインタ取得をサポートしていないと考えられます。
実はATLもCStringT
は&
演算子をオーバーロードしていません。おそらくですが、参照カウントを使用しないCComPtr
やCComHeapPtr
と違って内部のCStringData
が参照カウンタを使っていること、つまりshared_ptr
と似たような実装であることに起因すると考えられます。
なお、他のC++用ライブラリであるWILではuwil::nique_ptr
に&
演算子を定義すると同時にwil::unique_any
にはwil::out_param
というアダプタクラスを用意することで上記の共有問題を解決しています。あまり有名ではないですがWindows環境の趣味開発では便利なので、ぜひ一度。