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

请教:C++匿名函数调用赋值语句的语法含义

关于C++匿名函数赋值语句的疑问解答

问题

请问下述代码的第一行具体实现什么功能?我难以理解赋值语句右侧的语法——尤其是[]()和末尾的()部分,这看起来像是某种匿名内联函数调用,但我此前从未见过该写法。

HBRUSH hBrBlack = []() { return CreateSolidBrush(COLOR_BLACK); }();

补充上下文:上述句柄的使用场景如下:

HBRUSH MyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (nCtlColor == CTLCOLOR_LISTBOX)
    {
        int id(pWnd->GetDlgCtrlID());

        if (id == ID_LST_MTRS)
        {
            pDC->SetTextColor(COLOR_WHITE);
            pDC->SetBkColor(COLOR_BLACK);
            return hBrBlack;
        }
    }

    // All the rest
    return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

解答

核心功能

这行代码的作用就是创建一个黑色画刷的句柄hBrBlack,后续在对话框的控件着色逻辑中,用它来指定目标列表框的背景画刷。

语法拆解

你看到的是C++11开始支持的lambda表达式(匿名函数),拆解开每部分的意义:

  • []:lambda的捕获列表,这里为空,表示这个匿名函数不会捕获任何外部变量
  • ():lambda的参数列表,空列表意味着调用这个函数不需要传入参数
  • { return CreateSolidBrush(COLOR_BLACK); }:lambda的函数体,内部调用CreateSolidBrush生成黑色画刷并返回
  • 末尾的():这是直接调用刚定义的匿名lambda函数,让它立即执行,把返回的画刷句柄赋值给hBrBlack

换成普通函数的写法你就很熟悉了,它完全等价于:

// 定义一个普通命名函数
HBRUSH CreateBlackBrush() {
    return CreateSolidBrush(COLOR_BLACK);
}
// 调用函数完成赋值
HBRUSH hBrBlack = CreateBlackBrush();

用lambda的好处是不用额外定义单独的命名函数,直接在赋值语句里完成函数定义+调用,代码更紧凑简洁。

结合上下文的实际作用

在OnCtlColor函数中,当检测到当前处理的是ID_LST_MTRS列表框时,先设置文本为白色、背景色为黑色,然后返回hBrBlack这个画刷句柄,Windows系统会使用这个画刷来绘制该列表框的背景区域。

内容的提问来源于stack exchange,提问作者MPW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:25:17