参考: C++でデストラクタを呼ばなくていい条件 - 野良C++erの雑記帳
std::cout << boost::has_trivial_destructor< int >::value << std::endl; // true std::cout << boost::has_trivial_destructor< boost::optional<int> >::value << std::endl; // false std::cout << boost::has_trivial_destructor< boost::optional<int&> >::value << std::endl; // false
boost::optional
普通に考えて、 T のデストラクタが trivial なら、デストラクタ呼ばなくていいじゃん。
T が初期化されてる場合でもされてない場合でも、結局何もしないんだから。
細かいことですが、これって結構パフォーマンスに効いてきます。
普通はコンパイラが最適化してくれますが、冒頭で挙げたように、
ライブラリ作者が「コンパイラの知らない情報」を元に、手で最適化する場合、
本来 trivial であるべきデストラクタが trivial でないのは痛いです。
部分特殊化すればいい問題でもありますが、限度というものもありますし。
なお、デストラクタが無意味に non-trivial なのは、 boost::noncopyable も同じです。
http://ideone.com/r5CIK
コンストラクタとデストラクタを protected にする為とはいえ…ぐぬぬ。
追記:
optional
http://ideone.com/PIEfo
optional
T* 以外の何物でも無いハズだし、当然コストも同じだと思ってたのに。
Boost.Optionalに対して、初めて 割と本気で「爆発しろ」と思ったかもしれない。
コンパイラの最適化を考えても、これは少し残念すぎるでしょう。