You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:21:33