如何用std::invoke_result_t获取带推导this的Lambda返回类型?
带推导this的Lambda与std::invoke_result_t的使用问题
是的,必须在std::invoke_result_t的模板参数中显式指定self对应的参数类型,你的代码才能正常编译。
原因分析
带推导this的Lambda,其调用操作符签名是显式包含self参数的:
auto operator()(this auto& self, int x) -> int;
普通Lambda的调用操作符没有这个显式的self参数,因此使用std::invoke_result_t时只需传入用户定义的参数类型即可。但带推导this的Lambda要求std::invoke_result_t匹配完整的调用签名,包括self对应的参数类型——也就是Lambda自身的引用类型(因为self是auto&)。
修正后的代码
#include <type_traits> auto lambda = [](this auto& self, int x) -> int { return x; }; // 传入Lambda的引用类型作为self对应的参数 auto x = std::invoke_result_t<decltype(lambda)&, int>{};
你也可以通过类型断言验证返回类型是否正确:
using ReturnType = std::invoke_result_t<decltype(lambda)&, int>; static_assert(std::is_same_v<ReturnType, int>); // 编译通过,验证返回类型为int
内容的提问来源于stack exchange,提问作者Gallaros
相关产品推荐
相关产品推荐

