This commit is contained in:
Simon Brand committed 2017-10-21 09:33:16 +01:00
1 parent 6253bac1f6
commit af15c103d5
2 files changed
+415 -374

No files matched your search

+295 -349
View File
@@ -1,309 +1,84 @@
# Header file `optional.hpp`<a id="optional.hpp"></a>
<pre><code class="language-cpp">#define <a href='doc_optional.md#optional.hpp'>TL_OPTIONAL_11_CONSTEXPR</a>
#define <a href='doc_optional.md#optional.hpp'>TL_OPTIONAL_MSVC_2015_CONSTEXPR</a>
namespace <a href='doc_optional.md#optional.hpp'>tl</a>
<pre><code class="language-cpp">namespace <a href='doc_optional.md#optional.hpp'>tl</a>
{
class <a href='doc_optional.md#optional.hpp'>monostate</a>;
class <a href='doc_optional.md#tl::monostate'>monostate</a>;
namespace <a href='doc_optional.md#optional.hpp'>detail</a>
{
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>remove_cv_t</a> = typename std::remove_cv&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>remove_const_t</a> = typename std::remove_const&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>remove_volatile_t</a> = typename std::remove_volatile&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>add_cv_t</a> = typename std::add_cv&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>add_const_t</a> = typename std::add_const&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>add_volatile_t</a> = typename std::add_volatile&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>remove_reference_t</a> = typename std::remove_reference&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>add_lvalue_reference_t</a> = typename std::add_lvalue_reference&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>add_rvalue_reference_t</a> = typename std::add_rvalue_reference&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>remove_pointer_t</a> = typename std::remove_pointer&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>add_pointer_t</a> = typename std::add_pointer&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>make_signed_t</a> = typename std::make_signed&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>make_unsigned_t</a> = typename std::make_unsigned&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>remove_extent_t</a> = typename std::remove_extent&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>remove_all_extents_t</a> = typename std::remove_all_extents&lt;T&gt;::type;
template &lt;<a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::size_t'>std::size_t</a> N, <a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::size_t'>std::size_t</a> A = N&gt;
using <a href='doc_optional.md#optional.hpp'>aligned_storage_t</a> = typename std::aligned_storage&lt;N, A&gt;::type;
template &lt;<a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::size_t'>std::size_t</a> N, class ... Ts&gt;
using <a href='doc_optional.md#optional.hpp'>aligned_union_t</a> = typename std::aligned_union&lt;N, Ts...&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>decay_t</a> = typename std::decay&lt;T&gt;::type;
template &lt;bool E, class T = void&gt;
using <a href='doc_optional.md#optional.hpp'>enable_if_t</a> = typename std::enable_if&lt;E, T&gt;::type;
template &lt;bool B, class T, class F&gt;
using <a href='doc_optional.md#optional.hpp'>conditional_t</a> = typename std::conditional&lt;B, T, F&gt;::type;
template &lt;class ... Ts&gt;
using <a href='doc_optional.md#optional.hpp'>common_type_t</a> = typename std::common_type&lt;Ts...&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>underlying_type_t</a> = typename std::underlying_type&lt;T&gt;::type;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>result_of_t</a> = typename std::result_of&lt;T&gt;::type;
template &lt;class&gt;
struct <a href='doc_optional.md#optional.hpp'>conjunction</a>;
template &lt;class B&gt;
struct <a href='doc_optional.md#optional.hpp'>conjunction&lt;B&gt;</a>;
template &lt;class B, class ... Bs&gt;
struct <a href='doc_optional.md#optional.hpp'>conjunction&lt;B, Bs...&gt;</a>;
template &lt;class&gt;
struct <a href='doc_optional.md#optional.hpp'>voider</a>;
template &lt;class ... Ts&gt;
using <a href='doc_optional.md#optional.hpp'>void_t</a> = typename voider&lt;Ts...&gt;::type;
template &lt;class T&gt;
struct <a href='doc_optional.md#optional.hpp'>is_optional_impl</a>;
template &lt;class T&gt;
struct <a href='doc_optional.md#optional.hpp'>is_optional_impl&lt;optional&lt;T&gt;&gt;</a>;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>is_optional</a> = <a href='doc_optional.md#optional.hpp'>is_optional_impl&lt;decay_t&lt;T&gt;&gt;</a>;
template &lt;typename Fn, typename ... Args, typename = enable_if_t&lt;std::is_member_pointer&lt;decay_t&lt;Fn&gt;&gt;{}&gt;, int=0&gt;
constexpr decltype(std::mem_fn(f)(std::forward&lt;Args&gt;(args)...)) <a href='doc_optional.md#optional.hpp'>invoke</a>(Fn&amp;&amp; f, Args&amp;&amp;... args) noexcept(noexcept(std::mem_fn(f)(std::forward&lt;Args&gt;(args)...)));
template &lt;typename Fn, typename ... Args, typename = enable_if_t&lt;!std::is_member_pointer&lt;decay_t&lt;Fn&gt;&gt;{}&gt;&gt;
constexpr decltype(std::forward&lt;Fn&gt;(f)(std::forward&lt;Args&gt;(args)...)) <a href='doc_optional.md#optional.hpp'>invoke</a>(Fn&amp;&amp; f, Args&amp;&amp;... args) noexcept(noexcept(std::forward&lt;Fn&gt;(f)(std::forward&lt;Args&gt;(args)...)));
template &lt;class F, class ... Us&gt;
struct <a href='doc_optional.md#optional.hpp'>invoke_result_impl&lt;F, decltype(invoke(std::declval&lt;F&gt;(), std::declval&lt;Us&gt;()...), void()), Us...&gt;</a>;
template &lt;class F, class ... Us&gt;
using <a href='doc_optional.md#optional.hpp'>invoke_result</a> = invoke_result_impl&lt;F, void, Us...&gt;;
template &lt;class F, class ... Us&gt;
using <a href='doc_optional.md#optional.hpp'>invoke_result_t</a> = typename invoke_result&lt;F, Us...&gt;::type;
template &lt;class U&gt;
using <a href='doc_optional.md#optional.hpp'>fixup_void</a> = <a href='doc_optional.md#optional.hpp'>conditional_t&lt;std::is_void&lt;U&gt;::value, monostate, U&gt;</a>;
template &lt;class F, class ... U&gt;
struct <a href='doc_optional.md#optional.hpp'>get_invoke_optional_ret</a>;
template &lt;class F, class ... U&gt;
using <a href='doc_optional.md#optional.hpp'>get_invoke_ret</a> = typename conditional_t&lt;is_optional&lt;F&gt;::value, get_invoke_optional_ret&lt;F, U...&gt;, invoke_result&lt;F, U...&gt;&gt;::type;
template &lt;class F, class U&gt;
using <a href='doc_optional.md#optional.hpp'>get_map_return</a> = <a href='doc_optional.md#tl::optional-T-'>optional&lt;fixup_void&lt;get_invoke_ret&lt;F, U&gt;&gt;&gt;</a>;
template &lt;class F, class ... U&gt;
using <a href='doc_optional.md#optional.hpp'>returns_void</a> = <a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::is_void%3cget_invoke_ret%3cF,U...%3e%3e'>std::is_void&lt;get_invoke_ret&lt;F, U...&gt;&gt;</a>;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>disable_if_optional</a> = <a href='doc_optional.md#optional.hpp'>enable_if_t&lt;!is_optional&lt;T&gt;::value&gt;</a>;
template &lt;class T&gt;
using <a href='doc_optional.md#optional.hpp'>enable_if_optional</a> = <a href='doc_optional.md#optional.hpp'>enable_if_t&lt;is_optional&lt;T&gt;::value&gt;</a>;
template &lt;class T, class ... U&gt;
using <a href='doc_optional.md#optional.hpp'>enable_if_ret_void</a> = <a href='doc_optional.md#optional.hpp'>enable_if_t&lt;returns_void&lt;T&amp;&amp;, U...&gt;::value&gt;</a>;
template &lt;class T, class ... U&gt;
using <a href='doc_optional.md#optional.hpp'>disable_if_ret_void</a> = <a href='doc_optional.md#optional.hpp'>enable_if_t&lt;!returns_void&lt;T&amp;&amp;, U...&gt;::value&gt;</a>;
}
struct <a href='doc_optional.md#tl::in_place_t'>in_place_t</a>;
struct <a href='doc_optional.md#optional.hpp'>in_place_t</a>;
constexpr <a href='doc_optional.md#tl::in_place_t'>in_place_t{}</a> <a href='doc_optional.md#tl::in_place'>in_place</a>;
constexpr <a href='doc_optional.md#optional.hpp'>in_place_t{}</a> <a href='doc_optional.md#optional.hpp'>in_place</a>;
struct <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>;
namespace <a href='doc_optional.md#optional.hpp'>detail</a>
{
template &lt;class T, class U&gt;
using <a href='doc_optional.md#optional.hpp'>enable_forward_value</a> = <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_constructible&lt;T, U&amp;&amp;&gt;::value&amp;&amp;!std::is_same&lt;detail::decay_t&lt;U&gt;, in_place_t&gt;::value&amp;&amp;!std::is_same&lt;optional&lt;T&gt;, detail::decay_t&lt;U&gt;&gt;::value&gt;</a>;
template &lt;class T, class U, class Other&gt;
using <a href='doc_optional.md#optional.hpp'>enable_from_other</a> = <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_constructible&lt;T, Other&gt;::value&amp;&amp;!std::is_constructible&lt;T, optional&lt;U&gt;&amp;&gt;::value&amp;&amp;!std::is_constructible&lt;T, optional&lt;U&gt;&amp;&amp;&gt;::value&amp;&amp;!std::is_constructible&lt;T, const optional&lt;U&gt;&amp;&gt;::value&amp;&amp;!std::is_constructible&lt;T, const optional&lt;U&gt;&amp;&amp;&gt;::value&amp;&amp;!std::is_convertible&lt;optional&lt;U&gt;&amp;, T&gt;::value&amp;&amp;!std::is_convertible&lt;optional&lt;U&gt;&amp;&amp;, T&gt;::value&amp;&amp;!std::is_convertible&lt;const optional&lt;U&gt;&amp;, T&gt;::value&amp;&amp;!std::is_convertible&lt;const optional&lt;U&gt;&amp;&amp;, T&gt;::value&gt;</a>;
template &lt;class T, class U&gt;
using <a href='doc_optional.md#optional.hpp'>enable_assign_forward</a> = <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;!std::is_same&lt;optional&lt;T&gt;, detail::decay_t&lt;U&gt;&gt;::value&amp;&amp;!detail::conjunction&lt;std::is_scalar&lt;T&gt;, std::is_same&lt;T, detail::decay_t&lt;U&gt;&gt;&gt;::value&amp;&amp;std::is_constructible&lt;T, U&gt;::value&amp;&amp;std::is_assignable&lt;T&amp;, U&gt;::value&gt;</a>;
template &lt;class T, class U, class Other&gt;
using <a href='doc_optional.md#optional.hpp'>enable_assign_from_other</a> = <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_constructible&lt;T, Other&gt;::value&amp;&amp;std::is_assignable&lt;T&amp;, Other&gt;::value&amp;&amp;!std::is_constructible&lt;T, optional&lt;U&gt;&amp;&gt;::value&amp;&amp;!std::is_constructible&lt;T, optional&lt;U&gt;&amp;&amp;&gt;::value&amp;&amp;!std::is_constructible&lt;T, const optional&lt;U&gt;&amp;&gt;::value&amp;&amp;!std::is_constructible&lt;T, const optional&lt;U&gt;&amp;&amp;&gt;::value&amp;&amp;!std::is_convertible&lt;optional&lt;U&gt;&amp;, T&gt;::value&amp;&amp;!std::is_convertible&lt;optional&lt;U&gt;&amp;&amp;, T&gt;::value&amp;&amp;!std::is_convertible&lt;const optional&lt;U&gt;&amp;, T&gt;::value&amp;&amp;!std::is_convertible&lt;const optional&lt;U&gt;&amp;&amp;, T&gt;::value&amp;&amp;!std::is_assignable&lt;T&amp;, optional&lt;U&gt;&amp;&gt;::value&amp;&amp;!std::is_assignable&lt;T&amp;, optional&lt;U&gt;&amp;&amp;&gt;::value&amp;&amp;!std::is_assignable&lt;T&amp;, const optional&lt;U&gt;&amp;&gt;::value&amp;&amp;!std::is_assignable&lt;T&amp;, const optional&lt;U&gt;&amp;&amp;&gt;::value&gt;</a>;
namespace <a href='doc_optional.md#optional.hpp'>swap_adl_tests</a>
{
struct <a href='doc_optional.md#optional.hpp'>tag</a>;
template &lt;class T&gt;
<a href='doc_optional.md#optional.hpp'>tag</a> <a href='doc_optional.md#optional.hpp'>swap</a>(T&amp;, T&amp;);
template &lt;class T, <a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::size_t'>std::size_t</a> N&gt;
<a href='doc_optional.md#optional.hpp'>tag</a> <a href='doc_optional.md#optional.hpp'>swap</a>(T(&amp;)[N] a, T(&amp;)[N] b);
template &lt;class, class&gt;
<a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::false_type'>std::false_type</a> <a href='doc_optional.md#optional.hpp'>can_swap</a>(...) noexcept(false);
template &lt;class T, class U, class = decltype(swap(std::declval&lt;T&amp;&gt;(), std::declval&lt;U&amp;&gt;()))&gt;
)&gt;std::true_type <a href='doc_optional.md#optional.hpp'>can_swap</a>(int) noexcept(noexcept(swap(std::declval&lt;T&amp;&gt;(), std::declval&lt;U&amp;&gt;())));
template &lt;class, class&gt;
<a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::false_type'>std::false_type</a> <a href='doc_optional.md#optional.hpp'>uses_std</a>(...);
template &lt;class T, class U&gt;
<a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::is_same%3cdecltype(swap(std::declval%3cT&%3e(),std::declval%3cU&%3e())),tag%3e'>std::is_same&lt;decltype(swap(std::declval&lt;T&amp;&gt;(), std::declval&lt;U&amp;&gt;())), tag&gt;</a> <a href='doc_optional.md#optional.hpp'>uses_std</a>(int);
template &lt;class T&gt;
struct <a href='doc_optional.md#optional.hpp'>is_std_swap_noexcept</a>;
template &lt;class T, <a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::size_t'>std::size_t</a> N&gt;
struct <a href='doc_optional.md#optional.hpp'>is_std_swap_noexcept&lt;T[N]&gt;</a>;
template &lt;class T, class U&gt;
struct <a href='doc_optional.md#optional.hpp'>is_adl_swap_noexcept</a>;
}
template &lt;class T, class U = T&gt;
struct <a href='doc_optional.md#optional.hpp'>is_swappable</a>;
template &lt;class T, <a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::size_t'>std::size_t</a> N&gt;
struct <a href='doc_optional.md#optional.hpp'>is_swappable&lt;T[N], T[N]&gt;</a>;
template &lt;class T, class U = T&gt;
struct <a href='doc_optional.md#optional.hpp'>is_nothrow_swappable</a>;
}
struct <a href='doc_optional.md#optional.hpp'>nullopt_t</a>;
constexpr <a href='doc_optional.md#optional.hpp'>nullopt_t{nullopt_t::do_not_use{}, nullopt_t::do_not_use{}}</a> <a href='doc_optional.md#optional.hpp'>nullopt</a>;
static constexpr nullopt_t nullopt;
class <a href='doc_optional.md#optional.hpp'>bad_optional_access</a>;
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator==</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constoptional-U-&)'>operator==</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator!=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constoptional-U-&)'>operator!=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constoptional-U-&)'>operator&lt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constoptional-U-&)'>operator&gt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constoptional-U-&)'>operator&lt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constoptional-U-&)'>operator&gt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator==</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator==</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator==</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator!=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator!=</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&lt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&lt;</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&lt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&lt;=</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&gt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&gt;</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&gt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,tl::nullopt_t)'>operator&gt;=</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator==</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator==</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator!=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator!=</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&lt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&lt;</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&lt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&lt;=</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&gt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&gt;</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&gt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#tl::operator==(constoptional-T-&,constU&)'>operator&gt;=</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator==</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator!=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator!=</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;, <a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;=</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;, <a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
template &lt;class T&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;=</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator==</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator==</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator!=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator!=</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&lt;=</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
template &lt;class T, class U&gt;
constexpr bool <a href='doc_optional.md#optional.hpp'>operator&gt;=</a>(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
template &lt;class T, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_move_constructible&lt;T&gt;::value&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;detail::is_swappable&lt;T&gt;::value&gt;*=nullptr</a>&gt;
void <a href='doc_optional.md#optional.hpp'>swap</a>(<a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept(noexcept(lhs.swap(rhs)));
void swap(optional&lt;T&gt; &amp;lhs, optional&lt;T&gt; &amp;rhs);
template &lt;class T&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional&lt;detail::decay_t&lt;T&gt;&gt;</a> <a href='doc_optional.md#optional.hpp'>make_optional</a>(T&amp;&amp; v);
@@ -321,20 +96,163 @@ namespace <a href='doc_optional.md#optional.hpp'>std</a>
namespace <a href='doc_optional.md#optional.hpp'>tl</a>
{
namespace <a href='doc_optional.md#optional.hpp'>detail</a>
{
template &lt;class T, bool=::std::is_trivially_destructible&lt;T&gt;::value&gt;
struct <a href='doc_optional.md#optional.hpp'>optional_storage_base</a>;
template &lt;class T&gt;
struct <a href='doc_optional.md#optional.hpp'>optional_storage_base&lt;T, true&gt;</a>;
}
template &lt;class T&gt;
class <a href='doc_optional.md#tl::optional-T-'>optional</a>;
}</code></pre>
-----
## Class `tl::monostate`<a id="tl::monostate"></a>
<pre><code class="language-cpp">class monostate
{
};</code></pre>
Represents an optional with no data; essentially a bool
## Struct `tl::in_place_t`<a id="tl::in_place_t"></a>
<pre><code class="language-cpp">struct in_place_t
{
<a href='doc_optional.md#tl::in_place_t'>in_place_t</a>() = default;
};</code></pre>
A tag type to tell optional to construct its value in-place
## Variable `tl::in_place`<a id="tl::in_place"></a>
<pre><code class="language-cpp">constexpr <a href='doc_optional.md#tl::in_place_t'>in_place_t{}</a> in_place;</code></pre>
A tag to tell optional to construct its value in-place
## Struct `tl::nullopt_t`<a id="tl::nullopt_t"></a>
<pre><code class="language-cpp">struct nullopt_t
{
struct <a href='doc_optional.md#tl::nullopt_t'>do_not_use</a>;
constexpr <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>(<a href='doc_optional.md#tl::nullopt_t'>do_not_use</a>, <a href='doc_optional.md#tl::nullopt_t'>do_not_use</a>) noexcept;
};</code></pre>
A tag type to represent an empty optional
## Variable `tl::nullopt`<a id="tl::nullopt"></a>
<pre><code class="language-cpp">static constexpr nullopt_t nullopt;</code></pre>
Represents an empty optional
*Examples*:
tl::optional<int> a = tl::nullopt;
void foo (tl::optional<int>);
foo(tl::nullopt); //pass an empty optional
## Comparison operator `tl::operator==`<a id="tl::operator==(constoptional-T-&,constoptional-U-&)"></a>
<pre><code class="language-cpp">(1) template &lt;class T, class U&gt;
constexpr bool operator==(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
(2) template &lt;class T, class U&gt;
constexpr bool operator!=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
(3) template &lt;class T, class U&gt;
constexpr bool operator&lt;(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
(4) template &lt;class T, class U&gt;
constexpr bool operator&gt;(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
(5) template &lt;class T, class U&gt;
constexpr bool operator&lt;=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
(6) template &lt;class T, class U&gt;
constexpr bool operator&gt;=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);</code></pre>
Compares two optional objects
If both optionals contain a value, they are compared with `T`s relational operators. Otherwise `lhs` and `rhs` are equal only if they are both empty, and `lhs` is less than `rhs` only if `rhs` is empty and `lhs` is not.
## Comparison operator `tl::operator==`<a id="tl::operator==(constoptional-T-&,tl::nullopt_t)"></a>
<pre><code class="language-cpp">(1) template &lt;class T&gt;
constexpr bool operator==(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
(2) template &lt;class T&gt;
constexpr bool operator==(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
(3) template &lt;class T&gt;
constexpr bool operator!=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
(4) template &lt;class T&gt;
constexpr bool operator!=(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
(5) template &lt;class T&gt;
constexpr bool operator&lt;(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
(6) template &lt;class T&gt;
constexpr bool operator&lt;(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;
(7) template &lt;class T&gt;
constexpr bool operator&lt;=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
(8) template &lt;class T&gt;
constexpr bool operator&lt;=(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;) noexcept;
(9) template &lt;class T&gt;
constexpr bool operator&gt;(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
(10) template &lt;class T&gt;
constexpr bool operator&gt;(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;) noexcept;
(11) template &lt;class T&gt;
constexpr bool operator&gt;=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp;, <a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
(12) template &lt;class T&gt;
constexpr bool operator&gt;=(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs) noexcept;</code></pre>
Compares an optional to a `nullopt`
Equivalent to comparing the optional to an empty optional
## Comparison operator `tl::operator==`<a id="tl::operator==(constoptional-T-&,constU&)"></a>
<pre><code class="language-cpp">(1) template &lt;class T, class U&gt;
constexpr bool operator==(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
(2) template &lt;class T, class U&gt;
constexpr bool operator==(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
(3) template &lt;class T, class U&gt;
constexpr bool operator!=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
(4) template &lt;class T, class U&gt;
constexpr bool operator!=(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
(5) template &lt;class T, class U&gt;
constexpr bool operator&lt;(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
(6) template &lt;class T, class U&gt;
constexpr bool operator&lt;(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
(7) template &lt;class T, class U&gt;
constexpr bool operator&lt;=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
(8) template &lt;class T, class U&gt;
constexpr bool operator&lt;=(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
(9) template &lt;class T, class U&gt;
constexpr bool operator&gt;(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
(10) template &lt;class T, class U&gt;
constexpr bool operator&gt;(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);
(11) template &lt;class T, class U&gt;
constexpr bool operator&gt;=(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; lhs, const U&amp; rhs);
(12) template &lt;class T, class U&gt;
constexpr bool operator&gt;=(const U&amp; lhs, const <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a>&amp; rhs);</code></pre>
Compares the optional with a value.
If the optional has a value, it is compared with the other value using `T`s relational operators. Otherwise, the optional is considered less than the value.
-----
@@ -346,60 +264,60 @@ class optional
public:
using <a href='doc_optional.md#tl::optional-T-'>value_type</a> = T;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>() noexcept = default;
constexpr <a href='doc_optional.md#tl::optional-T-::optional()'>optional</a>() noexcept = default;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
constexpr <a href='doc_optional.md#tl::optional-T-::optional(tl::nullopt_t)'>optional</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>(const <a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; rhs);
constexpr <a href='doc_optional.md#tl::optional-T-::optional(constoptional-T-&)'>optional</a>(const <a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; rhs);
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>(<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp;&amp; rhs) noexcept(std::is_nothrow_move_constructible&lt;T&gt;::value);
constexpr <a href='doc_optional.md#tl::optional-T-::optional(optional-T-&&)'>optional</a>(<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp;&amp; rhs) noexcept(std::is_nothrow_move_constructible&lt;T&gt;::value);
template &lt;class ... Args&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>(<a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_constructible&lt;T, Args...&gt;::value, in_place_t&gt;</a>, Args&amp;&amp;... args);
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>('hidden', Args&amp;&amp;... args);
template &lt;class U, class ... Args&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>(<a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_constructible&lt;T, std::initializer_list&lt;U&gt;&amp;, Args&amp;&amp;...&gt;::value, in_place_t&gt;</a>, <a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::initializer_list%3cU%3e'>std::initializer_list&lt;U&gt;</a> il, Args&amp;&amp;... args);
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>('hidden', <a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::initializer_list%3cU%3e'>std::initializer_list&lt;U&gt;</a> il, Args&amp;&amp;... args);
template &lt;class U = T, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_convertible&lt;U&amp;&amp;, T&gt;::value&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_forward_value&lt;T, U&gt;*=nullptr</a>&gt;
template &lt;class U = T, 'hidden', 'hidden'&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>(U&amp;&amp; u);
template &lt;class U = T, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;!std::is_convertible&lt;U&amp;&amp;, T&gt;::value&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_forward_value&lt;T, U&gt;*=nullptr</a>&gt;
template &lt;class U = T, 'hidden', 'hidden'&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional</a>(U&amp;&amp; u);
template &lt;class U, <a href='doc_optional.md#optional.hpp'>detail::enable_from_other&lt;T, U, const U&amp;&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_convertible&lt;const U&amp;, T&gt;::value&gt;*=nullptr</a>&gt;
template &lt;class U, 'hidden', 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class U, <a href='doc_optional.md#optional.hpp'>detail::enable_from_other&lt;T, U, const U&amp;&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;!std::is_convertible&lt;const U&amp;, T&gt;::value&gt;*=nullptr</a>&gt;
template &lt;class U, 'hidden', 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class U, <a href='doc_optional.md#optional.hpp'>detail::enable_from_other&lt;T, U, U&amp;&amp;&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_convertible&lt;U&amp;&amp;, T&gt;::value&gt;*=nullptr</a>&gt;
template &lt;class U, 'hidden', 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional</a>(<a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp;&amp; rhs);
template &lt;class U, <a href='doc_optional.md#optional.hpp'>detail::enable_from_other&lt;T, U, U&amp;&amp;&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;!std::is_convertible&lt;U&amp;&amp;, T&gt;::value&gt;*=nullptr</a>&gt;
template &lt;class U, 'hidden', 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional</a>(<a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp;&amp; rhs);
<a href='doc_optional.md#tl::optional-T-'>~optional</a>() = default;
<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; <a href='doc_optional.md#tl::optional-T-'>operator=</a>(<a href='doc_optional.md#optional.hpp'>nullopt_t</a>) noexcept;
<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; <a href='doc_optional.md#tl::optional-T-'>operator=</a>(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;
<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; <a href='doc_optional.md#tl::optional-T-'>operator=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; rhs);
<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; <a href='doc_optional.md#tl::optional-T-'>operator=</a>(<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp;&amp; rhs) noexcept(std::is_nothrow_move_assignable&lt;T&gt;::value&amp;&amp;std::is_nothrow_move_constructible&lt;T&gt;::value);
template &lt;class U = T, <a href='doc_optional.md#optional.hpp'>detail::enable_assign_forward&lt;T, U&gt;*=nullptr</a>&gt;
template &lt;class U = T, 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; <a href='doc_optional.md#tl::optional-T-'>operator=</a>(U&amp;&amp; u);
template &lt;class U, <a href='doc_optional.md#optional.hpp'>detail::enable_assign_from_other&lt;T, U, const U&amp;&gt;*=nullptr</a>&gt;
template &lt;class U, 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; <a href='doc_optional.md#tl::optional-T-'>operator=</a>(const <a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp; rhs);
template &lt;class U, <a href='doc_optional.md#optional.hpp'>detail::enable_assign_from_other&lt;T, U, U&gt;*=nullptr</a>&gt;
template &lt;class U, 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; <a href='doc_optional.md#tl::optional-T-'>operator=</a>(<a href='doc_optional.md#tl::optional-T-'>optional&lt;U&gt;</a>&amp;&amp; rhs);
template &lt;class ... Args&gt;
T&amp; <a href='doc_optional.md#tl::optional-T-'>emplace</a>(Args&amp;&amp;... args);
template &lt;class U, class ... Args&gt;
<a href='doc_optional.md#optional.hpp'>detail::enable_if_t&lt;std::is_constructible&lt;T, std::initializer_list&lt;U&gt;&amp;, Args&amp;&amp;...&gt;::value, T&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-'>emplace</a>(<a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::initializer_list%3cU%3e'>std::initializer_list&lt;U&gt;</a> il, Args&amp;&amp;... args);
'hidden' <a href='doc_optional.md#tl::optional-T-'>emplace</a>(<a href='http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std::initializer_list%3cU%3e'>std::initializer_list&lt;U&gt;</a> il, Args&amp;&amp;... args);
void <a href='doc_optional.md#tl::optional-T-'>swap</a>(<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; rhs) noexcept(std::is_nothrow_move_constructible&lt;T&gt;::value&amp;&amp;detail::is_nothrow_swappable&lt;T&gt;::value);
@@ -436,73 +354,73 @@ public:
void <a href='doc_optional.md#tl::optional-T-'>reset</a>() noexcept;
template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&'>and_then</a>(F&amp;&amp; f) &amp;;
constexpr 'hidden' <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&'>and_then</a>(F&amp;&amp; f) &amp;;
template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&'>and_then</a>(F&amp;&amp; f) const &amp;;
constexpr 'hidden' <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&'>and_then</a>(F&amp;&amp; f) const &amp;;
template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&&'>and_then</a>(F&amp;&amp; f) &amp;&amp;;
constexpr 'hidden' <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&&'>and_then</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&&'>and_then</a>(F&amp;&amp; f) const &amp;&amp;;
constexpr 'hidden' <a href='doc_optional.md#tl::optional-T-::and_then(F&&)&&'>and_then</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F&gt; auto map(F &amp;&amp;f) &amp;;
template &lt;class F&gt; auto map(F &amp;&amp;f) const &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) &amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F, T&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) &amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) &amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) &amp;;
template &lt;class F&gt; auto map(F &amp;&amp;f) &amp;;
template &lt;class F&gt; auto map(F &amp;&amp;f) const &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T&amp;&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T&amp;&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F, T&amp;&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T&amp;&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T&amp;&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T&amp;&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T const&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T const&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) const &amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) const &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F, T const&amp;&gt;*=nullptr</a>&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T const&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) const &amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
constexpr 'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) const &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T const&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T const&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) const &amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&'>map</a>(F&amp;&amp; f) const &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T const&amp;&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T const&amp;&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F, T const&amp;&amp;&gt;*=nullptr</a>&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T const&amp;&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
constexpr 'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::enable_if_optional&lt;F&gt;*=nullptr</a>, <a href='doc_optional.md#optional.hpp'>detail::enable_if_ret_void&lt;F, T const&amp;&amp;&gt;*=nullptr</a>&gt;
<a href='doc_optional.md#optional.hpp'>detail::get_map_return&lt;F, T&amp;&gt;</a> <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F, 'hidden', 'hidden'&gt;
'hidden' <a href='doc_optional.md#tl::optional-T-::map(F&&)&&'>map</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F&gt; optional&lt;T&gt; or_else (F &amp;&amp;f) &amp;;
template &lt;class F&gt; optional&lt;T&gt; or_else (F &amp;&amp;f) const &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F&gt;*=nullptr</a>&gt;
template &lt;class F, 'hidden'&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a> <a href='doc_optional.md#tl::optional-T-::or_else(F&&)&'>or_else</a>(F&amp;&amp; f) &amp;;
template &lt;class F&gt; optional&lt;T&gt; or_else (F &amp;&amp;f) &amp;&amp;;
template &lt;class F&gt; optional&lt;T&gt; or_else (F &amp;&amp;f) const &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F&gt;*=nullptr</a>&gt;
template &lt;class F, 'hidden'&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a> <a href='doc_optional.md#tl::optional-T-::or_else(F&&)&&'>or_else</a>(F&amp;&amp; f) &amp;&amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F&gt;*=nullptr</a>&gt;
template &lt;class F, 'hidden'&gt;
constexpr <a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a> <a href='doc_optional.md#tl::optional-T-::or_else(F&&)&'>or_else</a>(F&amp;&amp; f) const &amp;;
template &lt;class F, <a href='doc_optional.md#optional.hpp'>detail::disable_if_ret_void&lt;F&gt;*=nullptr</a>&gt;
template &lt;class F, 'hidden'&gt;
<a href='doc_optional.md#tl::optional-T-'>optional&lt;T&gt;</a> <a href='doc_optional.md#tl::optional-T-::or_else(F&&)&&'>or_else</a>(F&amp;&amp; f) const &amp;&amp;;
template &lt;class F, class U&gt;
@@ -532,13 +450,41 @@ public:
An optional object is an object that contains the storage for another object and manages the lifetime of this contained object, if any. The contained object may be initialized after the optional object has been initialized, and may be destroyed before the optional object has been destroyed. The initialization state of the contained object is tracked by the optional object.
### Default constructor `tl::optional::optional`<a id="tl::optional-T-::optional()"></a>
<pre><code class="language-cpp">constexpr optional() noexcept = default;</code></pre>
Constructs an optional that does not contain a value.
### Constructor `tl::optional::optional`<a id="tl::optional-T-::optional(tl::nullopt_t)"></a>
<pre><code class="language-cpp">constexpr optional(<a href='doc_optional.md#tl::nullopt_t'>nullopt_t</a>) noexcept;</code></pre>
Constructs an optional that does not contain a value.
### Constructor `tl::optional::optional`<a id="tl::optional-T-::optional(constoptional-T-&)"></a>
<pre><code class="language-cpp">constexpr optional(const <a href='doc_optional.md#tl::optional-T-'>optional</a>&amp; rhs);</code></pre>
Copy constructor
If `rhs` contains a value, the stored value is direct-initialized with it. Otherwise, the constructed optional is empty.
### Constructor `tl::optional::optional`<a id="tl::optional-T-::optional(optional-T-&&)"></a>
<pre><code class="language-cpp">constexpr optional(<a href='doc_optional.md#tl::optional-T-'>optional</a>&amp;&amp; rhs) noexcept(std::is_nothrow_move_constructible&lt;T&gt;::value);</code></pre>
Move constructor
If `rhs` contains a value, the stored value is direct-initialized with it. Otherwise, the constructed optional is empty.
### Function template `tl::optional::and_then`<a id="tl::optional-T-::and_then(F&&)&"></a>
<pre><code class="language-cpp">(1) template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> and_then(F&amp;&amp; f) &amp;;
constexpr 'hidden' and_then(F&amp;&amp; f) &amp;;
(2) template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> and_then(F&amp;&amp; f) const &amp;;</code></pre>
constexpr 'hidden' and_then(F&amp;&amp; f) const &amp;;</code></pre>
Carries out some operation which returns an optional on the stored object if there is one.
@@ -549,10 +495,10 @@ Carries out some operation which returns an optional on the stored object if the
### Function template `tl::optional::and_then`<a id="tl::optional-T-::and_then(F&&)&&"></a>
<pre><code class="language-cpp">(1) template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> and_then(F&amp;&amp; f) &amp;&amp;;
constexpr 'hidden' and_then(F&amp;&amp; f) &amp;&amp;;
(2) template &lt;class F&gt;
constexpr <a href='doc_optional.md#optional.hpp'>detail::invoke_result_t&lt;F, T&gt;</a> and_then(F&amp;&amp; f) const &amp;&amp;;</code></pre>
constexpr 'hidden' and_then(F&amp;&amp; f) const &amp;&amp;;</code></pre>
Carries out some operation which returns an optional on the stored object if there is one.