[libcxx/variant] Correctly propagate return type of the visitor.

The tests for it were missing so I've added them.

Reviewed By: #libc, EricWF

Differential Revision: https://reviews.llvm.org/D86006

Cr-Mirrored-From: https://chromium.googlesource.com/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: e0ec7a02064968c7df11713689107148b4efb993
diff --git a/include/variant b/include/variant
index 7183ec0..aa1c17e 100644
--- a/include/variant
+++ b/include/variant
@@ -595,7 +595,7 @@
   __visit_alt_impl(index_sequence<_Is...>, _Vis&& __vis, _Vs&&... __vs) {
     using __multi = __multi<__uncvref_t<_Vs>::__size()...>;
     constexpr auto __dispatch = [](auto... __is) {
-      return +[](_Vis&& __vis_, _Vs&&... __vs_) {
+      return +[](_Vis&& __vis_, _Vs&&... __vs_) -> decltype(auto) {
         return __invoke_constexpr(
             _VSTD::forward<_Vis>(__vis_),
             __access::__base::__get_alt<decltype(__is)::value>(