| Home | Libraries | People | FAQ | More

## A note about optional<bool>

`optional<bool>` should be used with special caution and consideration.

First, it is functionally similar to a tristate boolean (false,maybe,true) —such as boost::tribool— except that in a tristate boolean, the maybe state represents a valid value, unlike the corresponding state of an uninitialized `optional<bool>`. It should be carefully considered if an `optional<bool>` instead of a `tribool` is really needed.

Second, `optional<>` provides an implicit conversion to `bool`. This conversion refers to the initialization state and not to the contained value. Using `optional<bool>` can lead to subtle errors due to the implicit `bool` conversion:

    void foo ( bool v ) ;
    void bar()
    {
        optional<bool> v = try();

        // The following intended to pass the value of 'v' to foo():
        foo(v);
        // But instead, the initialization state is passed
        // due to a typo: it should have been foo(*v).
    }

The only implicit conversion is to `bool`, and it is safe in the sense that typical integral promotions don't apply (i.e. if `foo()` takes an `int` instead, it won't compile).