boost::optional について

以前、
それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳
という記事を書いたのですが、
その中の boost::optional に関して誤りがあったので、訂正したいと思います。



この post を見て、慌てて確認したところ、 boost::optional の operator= は、

If *this was initialized, T's assignment operator is used, otherwise, its copy-constructor is used.

と公式ドキュメント *1 に書いてあるので、
boost::optional に対する operator= の呼び出しは ill-formed です。


で、それに対する対処方法としては、

boost::optional<int const> x = 0;
x = boost::in_place(1);

とする方法を思いついたのですが、実はこれもコンパイルエラー。
ですが、これに関しては、そうなる(文法上、あるいは「あえてしている」なら、あえてそうしている)理由がよく分かりません。
operator= がそうなってるのは、効率を考慮すると極めて妥当だと思いますが、これは禁止する理由もないですし。

というわけで、機会があったら調べてみたいと思います。


正直 僕としては、 boost::optional のこの辺りの動作は、正直想定外でした。
例の記事のコードは、全部ちゃんとテストした筈なのですが…。
この辺は僕の理解が浅かったと反省すると共に、
この際なので boost::optional 辺りのメーリスをざっとチェックして、
必要とあればパッチを書いて送ってみるのも悪くないかな、と思ってます。
ただまぁ boost::optional は古いコンパイラにも対応してるライブラリなので、
僕が出来ることはそれほどない気もしますが…。


アキラさんも最近いろいろと活躍してるみたいですし、負けてられませんね。