C++捕获this的lambda作为类成员时decltype(auto)推导报错求助
问题:捕获
this的Lambda作为类成员时的类型推导错误 尝试通过返回类型为decltype(auto)的成员函数gen_lambda()推导捕获this的Lambda类型,并将该Lambda作为entity类的成员,但编译器报错,提示在完成auto推导前就使用了gen_lambda()。
报错信息
:17:47: error: use of 'decltype(auto) entity::gen_lambda()' before deduction of 'auto' 17 | decltype(std::declval ().gen_lambda()) lambda_; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
原代码示例
#include <cstdio> #include <utility> struct entity { auto gen_lambda() -> decltype(auto) { return [this](){ printf("Hello!\n"); }; } entity() : lambda_(gen_lambda()) {} decltype(std::declval<entity>().gen_lambda()) lambda_; }; int main() { entity e; e.lambda_(); }
解决方案
方法1:使用std::function(简单直接)
用std::function<void()>直接声明成员变量,跳过Lambda具体类型的推导,适合无需依赖Lambda独有特性的场景:
#include <cstdio> #include <functional> struct entity { entity() : lambda_([this](){ printf("Hello!\n"); }) {} std::function<void()> lambda_; }; int main() { entity e; e.lambda_(); }
方法2:类外定义gen_lambda并提前声明类型(C++17及以上)
将gen_lambda的定义移到类外,先通过decltype声明类型别名,绕开类内类型推导的顺序限制:
#include <cstdio> #include <utility> struct entity; using lambda_type = decltype(std::declval<entity>().gen_lambda()); struct entity { auto gen_lambda() -> decltype(auto); entity() : lambda_(gen_lambda()) {} lambda_type lambda_; }; auto entity::gen_lambda() -> decltype(auto) { return [this](){ printf("Hello!\n"); }; } int main() { entity e; e.lambda_(); }
方法3:使用auto成员变量(C++17特性)
利用C++17支持的非静态成员变量auto类型推导,直接在类内初始化Lambda成员,无需显式声明类型:
#include <cstdio> struct entity { auto lambda_ = [this](){ printf("Hello!\n"); }; }; int main() { entity e; e.lambda_(); }
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

