【问题标题】:Can a lambda have extern "C" linkage?lambda 可以有外部“C”链接吗?
【发布时间】:2012-02-12 13:27:03
【问题描述】:

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

#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; });
}

但又是passing a static member function also worked on these platforms when it was not required to

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

【问题讨论】:

标签: c++ lambda c++11 linkage


【解决方案1】:

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

【讨论】:

  • SO ... 为什么不能将它作为参数传递给 C 函数? :(
  • 同意,这看起来像是官方立场给出的“没有 lambda 捕获的 lambda 表达式的闭包类型有一个公共的非虚拟非显式 const 转换函数,指向具有与闭包类型的函数调用运算符相同的参数和返回类型。此转换函数返回的值应为函数的地址”没有提及链接,可以安全地假设它是 C++ 链接,因此是不同的类型。
  • user166390:因为它没有被定义为具有 C 链接,而 C 函数必然需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多