Search code examples
c++lambdatype-deductionc++23explicit-object-parameter

Lambda with explicit object parameter and std::invoke_result_t


How do I get the return type of a lambda that has a deducing this signature using std::invoke_result_t.

auto lambda = [](this auto& self, int x) -> int {
    return x;
};  
  
auto x = std::invoke_result_t<decltype(lambda), int>{}; //won't compile

Do I need to somehow specify the self argument inside the std::invoke_result_t ?

I've tried without "deducing this" and the above sample works.

Edit: compiler explorer link


Solution

  • In your lambda, this auto& self actually takes an lvalue reference to this, but std::invoke_result_t<decltype(lambda), int> invokes the rvalue lambda.

    Since the rvalue cannot be bound to the lvalue reference, invoke_result has no valid member type, just as std::move(lambda)(0) is ill-formed.

    You should invoke the lambda with an lvalue, e.g.

    auto x = std::invoke_result_t<decltype(lambda)&, int>{};
    

    Or make the lambda accept a forward reference to this

    auto lambda = [](this auto&& self, int x) -> int {
        return x;
    };