7

前言——我喜欢 C++ lambda,如果可能的话,我会在任何地方使用它。

现在我有一个 lambda 要求,我需要一个 __stdcall lambda。但我收到以下错误消息:

 error C2664: 'EnumWindows' : cannot convert parameter 1 from '`anonymous-namespace'::<lambda1>' to 'WNDENUMPROC'
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

任何人都可以帮助我吗?这是我的代码(EnumWindowsProc 在函数范围内):

        auto EnumWindowsProc = 
            [&](HWND hwnd, LPARAM lParam) mutable -> bool
        {
            return true;
        };
        EnumWindows(EnumWindowsProc, NULL);
4

1 回答 1

11

我刚刚注意到你有visual studio 2010标签。无状态 lambda 在 VC11 中实现。参考

在 lambdas 被投票加入工作文件 (v0.9) 并添加了可变 lambdas (v1.0) 之后,标准化委员会彻底修改了措辞,产生了 lambdas v1.1。 这对于我们在 VC10 中实现来说太晚了,但我们已经在 VC11 中实现了它。 lambdas v1.1 的措辞阐明了在极端情况下应该发生的事情,例如引用静态成员或嵌套的 lambdas。这修复了由复杂的 lambda 触发的一堆错误。此外,无状态 lambda 现在可以转换为 VC11 中的函数指针。这不在 N2927 的措辞中,但无论如何我都将其视为 lambdas v1.1 的一部分。它是 FDIS 5.1.2 [expr.prim.lambda]/6:“没有 lambda 捕获的 lambda 表达式的闭包类型具有一个公共的非虚拟非显式 const 转换函数,该函数指向具有与闭包类型的函数调用运算符相同的参数和返回类型的函数的指针。此返回的值转换函数应该是一个函数的地址,当被调用时,它与调用闭包类型的函数调用运算符具有相同的效果。” (甚至比这更好,因为我们已经使无状态 lambda 可以转换为具有任意调用约定的函数指针。这在处理需要 __stdcall 函数指针等的 API 时很重要。

另外,请注意,当没有第二个粗体引用中提到的捕获规范时,会发生这种转换。

于 2013-07-18T03:52:30.980 回答