【问题标题】:how to use __stdcall to qualify C++ lambda?如何使用 __stdcall 来限定 C++ lambda?
【发布时间】:2013-07-16 20:31:40
【问题描述】:

前言——我喜欢 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);

【问题讨论】:

  • 尝试删除默认捕获&amp;
  • 感谢您的评论。我试过了,它不起作用。我得到了同样的错误信息。
  • 我不同意你的前言:lambas 应该只在需要时使用,就像其他一切一样。

标签: c++ windows visual-studio-2010 c++11 lambda


【解决方案1】:

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

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

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

【讨论】:

  • 我可以在函数范围内使用 lambda 函数来拥有 __stdcall 限定符吗?
  • 有趣,我从来不知道他们可以在需要时成为__stdcall
  • @Triumphant:尝试转换它static_cast&lt;bool(__stdcall *)(HWND, LPARAM)&gt;(EnumWindowsProc),不过我现在没有编译器可以测试。 编辑 没关系,这可能在 VC10 中不起作用,因为没有实现到函数指针的转换。
  • @Triumphant 我认为没有办法让它与 VC10 一起使用。正如 Jesse 的回答所解释的,无状态 lambda 到函数指针的隐式转换只能从 VC11 开始使用。如果升级到 VC11,static_cast 具有适当的调用约定 should fix the problem
猜你喜欢
  • 1970-01-01
  • 2017-11-28
  • 2010-11-20
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
相关资源
最近更新 更多