This library allows the template parameter
to be of reference type:
T&, and to some extent,
However, since references are not real objects some restrictions apply and some operations are not available in this case:
Also, even though
optional<T&> treats it wrapped pseudo-object
much as a real value, a true real reference is stored so aliasing will
optional<T&>will copy the references but all these references will nonetheless refer to the same object.
On compilers that do not conform to Standard C++ rules of reference binding, some operations on optional references are disabled in order to prevent subtle bugs. For more details see Dependencies and Portability section.
Rvalue references and lvalue references to const have the ability in C++ to extend the life time of a temporary they bind to. Optional references do not have this capability, therefore to avoid surprising effects it is not possible to initialize an optional references from a temporary. Optional rvalue references are disabled altogether. Also, the initialization and assignment of an optional reference to const from rvalue reference is disabled.
const int& i = 1; // legal optional<const int&> oi = 1; // illegal