ちょっと前の記事で、 boost::optional
非 trivial になってしまうので、ちょっと嫌だなー、という旨を書きましたが、
本の虫: C++0xにおけるPODの定義 を読んで、考え方が変わりました。
デストラクタに限らず、もっと進んで、 T が trivially copyable class であるならば、
boost::optional
無論、今のままでも恐らくは、 T が trivially copyable ならば、
boost::optional
memcpy を呼び出したりすることを筆頭とした黒魔術は行えるでしょうし、 *1
コンパイラさんも、しっかり中身の処理を把握した上で、適切に最適化してくれのでしょうが、
規格上文句なく trivially copyable であると言えるならば、それに越したことはない筈です。
…とは言ったものの、これは正直、あんまり優先順位は高くないと思います。
trivially copyable class であることを利用して極限まで最適化したい場合には、
そもそも Boost.Optional なんて使わない筈ですから。
それよりも、これまでに触れてきた、
optional
optional
…今後の発展に期待したいですね。
〜追記〜
よく考えたら、デストラクタはともかく、コピーを trivial にするのは、
巨大な T に対しては非効率的になってしまうことに気づきました。
これに対処するには…うりゅー。どうするのでしょう。
でも、とりあえず T& とか T* とか int とかの、
明らかに「 trivially copyable の方がコストがかからない」と分かるようなときは、
積極的に trivially copyable にするべきではあると思います。