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

This is the documentation for a snapshot of the develop branch, built from commit 3475a457cf.



    Copyright (c) 2015 - 2022 Andrzej Krzemienski

    Distributed under the Boost Software License, Version 1.0.
    (See accompanying file LICENSE_1_0.txt or copy at

[section:relnotes Release Notes]

[heading Boost Release 1.80]

* [*Breaking change:] Added specializations for `std::hash<boost::optional<T>>`. This fixes [@ issue #55]. You may get compiler errors when your program provides specializations for `std::hash<boost::optional<T>>`. If this happens, define macro `BOOST_OPTIONAL_CONFIG_DO_NOT_SPECIALIZE_STD_HASH` to suppress the specializations of `std::hash` in this library.

[heading Boost Release 1.79]

* Fixed [@ issue #98].

[heading Boost Release 1.77]

* Fixed [@ issue #92].

[heading Boost Release 1.76]

* Fixed MSVC warning C4702.

[heading Boost Release 1.75]

* `boost::none` is `constexpr`-declared.

* Fixed [@ issue #78].

[heading Boost Release 1.73]

* Fixed [@ issue #78].
* `boost::none` is now declared as an inline variable (on compilers that support it): there is only one instance of `boost::none` across all translation units.
* Fixed a number of compilation errors in GCC 4.4.7 in `optional<T>` for trivial `T`s. Thanks to Robert Leahy for the fix. For details see [@ pr #78].
* Now suppressing warning `-Wweak-vtables`.

[heading Boost Release 1.69]

* Remove deprecation mark from `reset()` method (without arguments).
* Fixed [@ issue #59].
* Fixed bug with initialization of certain wrapper types in clang with -std=c++03. See [@ pr #64].

[heading Boost Release 1.68]

* Added member function `has_value()` for compatibility with `std::optional` ([@ issue #52]).
* Added member function `map()` for transforming `optional<T>` into `optional<U>` using a function of type `T -> U`.
* Added member function `flat_map()` for transforming `optional<T>` into `optional<U>` using a function of type `T -> optional<U>`.

[heading Boost Release 1.67]

* Fixed [@ issue #46].
* Fixed `-Wzero-as-null-pointer-constant` warnings.

[heading Boost Release 1.66]

* On newer compilers `optional` is now trivially-copyable for scalar `T`s. This uses a different storage (just `T` rather than `aligned_storage`). We require the compiler to support defaulted functions.
* Changed the implementation of `operator==` to get rid of the `-Wmaybe-uninitialized` false-positive warning from GCC.

[heading Boost Release 1.63]
* Added two new in-place constructors. They work similarly to `emplace()` functions: they initialize the contained value by perfect-forwarding the obtained arguments. One constructor always initializes the contained value, the other based on a boolean condition.
* Syntax `o = {}` now correctly un-initializes optional, just like in `std::optional`.
* Fixed [@ Trac #12203].
* Fixed [@ Trac #12563].

[heading Boost Release 1.62]

* Fixed [@ Trac #12179].

[heading Boost Release 1.61]

* Now `boost::optional` is specialized for reference parameters. This addresses a couple of issues:
  * the `sizeof` of optional reference is that of a pointer,
  * some bugs connected to copying optional references are gone,
  * all run-time bugs caused by incorrect reference binding on some compilers are now turned into compile-time errors,
  * you can swap optional references: it is like swapping pointers: shallow, underlying objects are not affected,
  * optional references to abstract types work.
* Documented nested typedefs ([@ Trac #5193]).
* Made the perfect-forwarding constructor SFINAE-friendly, which fixes [@ Trac #12002]. However, this only works in the newer platforms that correctly implement C++11 `<type_traits>`.
* Fixed [@ Trac #10445].

[heading Boost Release 1.60]

* Changed the implementation of `boost::none` again. Now it is a const object with internal linkage (as any other tag). This fixes [@ Trac #11203].

[heading Boost Release 1.59]

* For C++03 compilers, added 0-argument overload for member function `emplace()`, and therewith removed the dependency on `<boost/utility/in_place_factory.hpp>`.
* Fixed [@ Trac #11241].

[heading Boost Release 1.58]

* `boost::none_t` is no longer convertible from literal `0`. This avoids a bug where `optional<rational<int>> oi = 0;` would initialize an optional object with no contained value.
* Improved the trick that prevents streaming out `optional` without header `optional_io.hpp` by using safe-bool idiom. This addresses [@ Trac #10825].
* IOStream operators are now mentioned in documentation.
* Added a way to manually disable move semantics: just define macro `BOOST_OPTIONAL_CONFIG_NO_RVALUE_REFERENCES`. This can be used to work around [@ Trac #10399].
* It is no longer possible to assign `optional<U>` to `optional<T>` when `U` is not assignable or convertible to `T` ([@ Trac #11087]).
* Value accessors now work correctly on rvalues of `optional<T&>` ([@ Trac #10839]).

[heading Boost Release 1.57]

* [@ Git pull #9]: ['"Supply `<string>` to fix C++03 compile error on `logic_error("...")`"].

[heading Boost Release 1.56]

* Added support for rvalue references. Now `optional<T>` works with moveable but non-copyable `T`'s,
* Improved `swap` (now uses move operations),
* Added function `emplace()`. This is the last of the requests from [@ Trac #1841],
* `optional` is moveable, including conditional `noexcept` specifications, which make it `move_if_noexcept`-friendly,
* Using explicit operator bool() on platforms that support it ([@ Trac #4227]) (breaking change),
* Forward declaration of `operator<<(ostream&, optional const&)` to prevent inadvertent incorrect serialization of optional objects,
* Removed deprecated function `reset()` from examples ([@ Trac #9005]),
* Equality comparison with `boost::none` does not require that `T` be EqualityComparable,
* Optional rvalue references are explicitly disallowed,
* Binding temporaries to optional references is explicitly disallowed (breaking change),
* More ways to access the contained value, functions `value()`, `value_or()`, `value_or_eval()`,
* Updated and reorganized documentation, added tutorial and quick guide sections.

[endsect][/ relnotes]