Подтвердить что ты не робот

Может ли лямбда иметь внешнюю связь "С"?

Это, похоже, работает на платформах, которые я пробовал:

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

но затем передача статической функции-члена также работала на этих платформах, когда это не требовалось.

Есть ли способ заставить лямбда иметь подходящую связь, чтобы сделать ее безопасной и переносной? Или это уже?

4b9b3361

Ответ 1

Нет. Lambdas - это, в конечном счете, объекты, у которых есть оператор вызова функции. Безъядерная лямбда может быть преобразована в указатель функции соответствующего типа, но этот указатель функции будет С++-функцией с С++-связью.