Это работает на платформах, которые я пробовал:
#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; }); }
, но опять же передача статической функции-члена также работала на этих платформах, когда не требовалось .
Есть ли способ заставить лямбду иметь подходящую связь, чтобы сделать ее безопасной и переносной?Или это уже?
Нет.В конечном счете, лямбды - это объекты, у которых есть оператор вызова функции.Лямбда без захвата может быть преобразована в указатель функции соответствующего типа, но указатель этой функции будет функцией C ++ со связью C ++.