https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98038

--- Comment #1 from Alisdair Meredith <alisdairm at me dot com> ---
The following example code gives an internal compiler error, I suspect due to
the invalid attempt to call `operator()` recursively on the lambda object.  Use
the -std=c++20 language flag:

#include <functional>
#include <type_traits>
#include <utility>

template <class T>
inline constexpr bool is_reference_wrapper_v = false;

template <class T>
inline constexpr bool is_reference_wrapper_v<std::reference_wrapper<T>> = true;

template <class T, class Fn>
constexpr
auto my_mem_fn(Fn T::*pmf) {
    return [pmf]<class U, class ...ARGS>(U&& p, ARGS&& ...args) ->
decltype(auto)
    {
        if constexpr(is_reference_wrapper_v<std::remove_reference_t<U>>) {
            return operator()(pmf, p.get(), std::forward<ARGS>(args)...);
        }
        else {
            return 12;
        }
    };
}

struct Dummy {
    constexpr int twelve() const { return 12; }
};

int main() {
   Dummy x{};
   auto y = my_mem_fn(&Dummy::twelve);
   int c = y(std::ref(x));
}

Reply via email to