generic なオブジェクトの遅延構築に boost::optional が使えるんじゃないでしょ〜か

boost::optional *1ってドキュメントの Motivation で戻り値の型としての使用が挙げられているけれど, generic な文脈でオブジェクトの遅延構築――つまりオブジェクトを構築するストレージは確保しておくけれど,その初期化は遅延したい場合(構築しないまま終わる可能性も含む)――を行うためのラッパとしても十分機能するよにゃ〜,とか思っていたらドキュメントの Example のところにほぼそのまんまの例(Optional local variables, Optional data members)があるじゃん.ずががががーん. Motivation のところしか読んでなかったから気づかなかった…….
汎用な文脈でオブジェクトの遅延構築がなぜ難しいかというと,

  • ストレージの alignment に気を使わないといけない
  • ストレージに実際のオブジェクトを構築する部分で例外安全性に気を使わないといけない
  • ストレージを破棄するとき(スコープから外れるとき)に必ずオブジェクトが構築されているかどうかを調べて,構築されていれば解体しないといけない

という理由からで, boost::optional ならこれらは全部 RAII な感じに処理されるのでうまーという. boost::optional なら自動変数による(スタックオブジェクトによる)の実装で,効率的にもほぼ余分な bool 変数1個分の空間的オーバーヘッドだけで済み,まぁほとんど問題にならないんじゃないかっちぅ.
しかしこのトピックを説明する上での最大の障害は,その「generic な文脈でオブジェクトを遅延構築するような実際の例」ががが…….個人的に挙げられるものは3つ4つくらいあるんだけれど,分かりやすい例がにゃいんだよにゃ〜.

*1:まったく関係ないですが個人的な読み方は当然「おぷしょにゃ〜る」