Makes the following operations constexpr:
- std::swap(optional, optional)
- optional(optional<U> const&)
- optional(optional<U>&&)
- ~optional()
- operator=(nullopt_t)
- operator=(U&&)
- operator=(optional<U> const&)
- operator=(optional<U>&&)
- emplace(Args&&...)
- emplace(initializer_list<U>, Args&&...)
- swap(optional&)
- reset()
P2231 has been accepted by plenary, with the committee recommending
implementers retroactively apply to C++20. It's necessary for us to
implement _`semiregular-box`_ and _`non-propagating-cache`_, both of
which are required for ranges (otherwise we'll need to reimplement
std::optional with these members constexprified).
Should be // constexpr in C++2b (in C++20 as an extension) or something along those lines, just to acknowledge that we're supporting that as an extension.