From e19260fd7dbef881492fd73891e0be5bd4a09b95 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 20 Nov 2020 09:52:55 -0800 Subject: Export of internal Abseil changes -- 1f91ba7fcb79244fce1fe448c1d31fb5b0580584 by Derek Mauro : Internal change PiperOrigin-RevId: 343511158 -- 8dcd61fed44f4e56044aa4a899cc3124117fa21f by Abseil Team : refactors result_of so it doesn't unnecessarily break in C++20 mode std::result_of was deprecated in C++17 and removed in C++20. This CL adds an implementation detail so it transparently continues to work when external users turn up to C++20 or later. The implementation is derived from C++17's specification of result_of [depr.meta.types][1]. [1]: https://timsong-cpp.github.io/cppwp/n4659/depr.meta.types Fixes #649 PiperOrigin-RevId: 343395432 GitOrigin-RevId: 1f91ba7fcb79244fce1fe448c1d31fb5b0580584 Change-Id: Id5d9c55dc7547737bade48a15f2f5740f414d811 --- absl/meta/type_traits.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'absl') diff --git a/absl/meta/type_traits.h b/absl/meta/type_traits.h index 75689bb6..d5cb5f3b 100644 --- a/absl/meta/type_traits.h +++ b/absl/meta/type_traits.h @@ -610,8 +610,22 @@ using common_type_t = typename std::common_type::type; template using underlying_type_t = typename std::underlying_type::type; -template -using result_of_t = typename std::result_of::type; + +namespace type_traits_internal { + +#if __cplusplus >= 201703L +// std::result_of is deprecated (C++17) or removed (C++20) +template struct result_of; +template +struct result_of : std::invoke_result {}; +#else +template using result_of = std::result_of; +#endif + +} // namespace type_traits_internal + +template +using result_of_t = typename type_traits_internal::result_of::type; namespace type_traits_internal { // In MSVC we can't probe std::hash or stdext::hash because it triggers a -- cgit v1.2.3