请教: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
相关产品推荐
相关产品推荐

