Boost.Optional は可能な限り trivial であるべきだ。

ちょっと前の記事で、 boost::optional のデストラクタは、 T のデストラクタが trivial であった場合でも
非 trivial になってしまうので、ちょっと嫌だなー、という旨を書きましたが、

本の虫: C++0xにおけるPODの定義 を読んで、考え方が変わりました。


デストラクタに限らず、もっと進んで、 T が trivially copyable class であるならば、
boost::optional も同様に trivially copyable class であるべきです。


無論、今のままでも恐らくは、 T が trivially copyable ならば、
boost::optional も trivially copyable であると(勝手に)みなして、
memcpy を呼び出したりすることを筆頭とした黒魔術は行えるでしょうし、 *1
コンパイラさんも、しっかり中身の処理を把握した上で、適切に最適化してくれのでしょうが、
規格上文句なく trivially copyable であると言えるならば、それに越したことはない筈です。


…とは言ったものの、これは正直、あんまり優先順位は高くないと思います。
trivially copyable class であることを利用して極限まで最適化したい場合には、
そもそも Boost.Optional なんて使わない筈ですから。


それよりも、これまでに触れてきた、
optional から optional<U> への変換が explicit だったりすることや、
optional がポインタの気軽な代替として使えない事の方が、問題な気もするので、

…今後の発展に期待したいですね。




〜追記〜


よく考えたら、デストラクタはともかく、コピーを trivial にするのは、
巨大な T に対しては非効率的になってしまうことに気づきました。
これに対処するには…うりゅー。どうするのでしょう。
でも、とりあえず T& とか T* とか int とかの、
明らかに「 trivially copyable の方がコストがかからない」と分かるようなときは、
積極的に trivially copyable にするべきではあると思います。

*1: boost::optional実装依存なので、実践する場合は自己責任でお願いします。