What is it, naokirin?

boost::optional と boost::logic::tribool の違い

boost::optionalの説明でも書かれていますが、一応メモ。


boost::triboolは3値論理と言われるものを表現するための型です。
一般の論理値、true, falseに加えて、indeterminate(不定)というものが加わっています。
これはboost::optionalに非常によく似ている気がします。

もちろん、これら二つの間には目的の大きな差異があります。

しかしながらこれらの違いとして、その他にも

1. 初期化の違い
2. 呼び出しの違い
3. 暗黙の変換の有無

が存在しています。(もちろん、論理演算を行う場合も結果が異なりますがそれは割愛します。)

初期化の違い

初期化の違いとしてはoptionalは初期化値を与えなければ、未初期化であるためにbool値を表していません。
しかし、triboolはfalseとなっています。

https://ideone.com/aaKgO

呼び出しの違い

呼び出しの違いも上記のコードを見ると分かると思います。

基本的にはtriboolの場合は普通に呼び出すことでindeterminate以外の値の判定ができます。indeterminateの判定は別に用意されています。
一方 optionalでは、単純に変数を呼び出した場合が値を持っているかどうか、"*"をつけて呼び出した場合が実際にoptionalが持つbool型の値、と言う風になっています。

暗黙の変換の有無

暗黙の変換はoptionalで起こります。つまり、bool型にoptionalを直接渡した場合はT型の値を持つかどうかをbool値に変換します。

つまりoptionalの保持するbool値を取り出したいと思って、"*"をつけずにboolに変換してしまうと、実際に値が入っているかの情報がbool型で取りだされることになります。


某書籍でoptionalの批判がされていました。「有効性を調べるために"!"がオーバーロードされているのがマズい」という内容でした。最近の記述を調べてもあまりそのような事例がないのでよくわからないですね…。昔のBoostライブラリの話なのでしょうか。

今回はそれを調べるために試してみたのですが、その書籍に書かれているような状況よりもむしろ、最後に挙げた暗黙の変換による問題がより注意すべきなのかもしれません。