Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Click here to view the latest version of this page.

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():
    // 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).