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

しかし、静的メンバー関数を渡すことも、必要がない場合にこれらのプラットフォームで機能しました

これを安全でポータブルにするためにラムダに適切なリンケージを強制する方法はありますか? それとももうですか?

4

1 に答える 1

8

いいえ。ラムダは、最終的には関数呼び出し演算子を持つオブジェクトです。キャプチャレスラムダは適切なタイプの関数ポインターに変換できますが、その関数ポインターはC++リンケージを持つC++関数になります。

于 2011-09-04T19:18:44.700 に答える