From 247677394ffe662eb3b6afe1a82f65873eea5e4b Mon Sep 17 00:00:00 2001 From: Simon Brand Date: Tue, 5 Dec 2017 19:51:20 +0000 Subject: [PATCH] Support mapping functions which return references --- optional.hpp | 6 +++--- tests/extensions.cpp | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/optional.hpp b/optional.hpp index 902d6fe..9629d9b 100644 --- a/optional.hpp +++ b/optional.hpp @@ -1595,7 +1595,7 @@ template (f), *std::forward(opt)) - : optional(nullopt); + : optional>(nullopt); } template ())), detail::enable_if_t::value> * = nullptr> -constexpr auto map_impl(Opt &&opt, F &&f) -> optional { +constexpr auto map_impl(Opt &&opt, F &&f) -> optional> { return opt.has_value() ? detail::invoke(std::forward(f), *std::forward(opt)) - : optional(nullopt); + : optional>(nullopt); } template o37 = tl::nullopt; auto o37r = std::move(o37).map([](int) { return; }); REQUIRE(!o37r); + + // callable which returns a reference + tl::optional o38 = 42; + auto o38r = o38.map([](int& i) -> const int& { return i; }); + REQUIRE(o38r); + REQUIRE(*o38r == 42); } SECTION("map constexpr") {