具有显式对象参数和 std::invoke_result_t 的 Lambda

Gal*_*ros 5 c++ lambda type-deduction c++23 explicit-object-parameter

如何获取具有使用推导此签名的 lambda 的返回类型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
Run Code Online (Sandbox Code Playgroud)

我是否需要以某种方式指定 self 参数std::invoke_result_t

我尝试过没有“推导这一点”,并且上面的示例有效。

编辑: 编译器资源管理器链接

康桓瑋*_*康桓瑋 7

在您的 lambda 中,this auto& self实际上采用对 的左值引用this,但std::invoke_result_t<decltype(lambda), int>调用右值lambda。

由于右值无法绑定到左值引用,因此invoke_result没有有效的成员type,就像std::move(lambda)(0)格式错误一样。

您应该使用左值调用 lambda,例如

auto x = std::invoke_result_t<decltype(lambda)&, int>{};
Run Code Online (Sandbox Code Playgroud)

或者让 lambda 接受向引用this

auto lambda = [](this auto&& self, int x) -> int {
    return x;
};
Run Code Online (Sandbox Code Playgroud)