15

这似乎适用于我尝试过的平台:

#include <iostream>

// extern "C" linkage
extern "C" void foo(void (*fn_ptr)(int));

namespace {
  struct bar {
    static void f(int);
  };
}

int main() {
  // Usually works on most platforms, not guaranteed though:
  foo(bar::f);

  // Probably equally bad or worse?
  foo([](int x) { std::cout << x << std::endl; });
}

但是当不需要时,再次传递静态成员函数也可以在这些平台上工作。

有没有办法强制 lambda 具有适当的链接以使其安全和便携?或者已经是了吗?

4

1 回答 1

8

不,Lambda 最终是具有函数调用运算符的对象。无捕获 lambda 可以转换为其适当类型的函数指针,但该函数指针将是具有 C++ 链接的 C++ 函数。

于 2011-09-04T19:18:44.700 回答