Мой предыдущий вопрос пришел к выводу, что для использования POSIX makecontext
с лямбда-функцией C ++ (т. Е. Функциональным объектом) может потребоваться неприятное «двойное приведение». Теперь я столкнулся с ошибкой компиляции, связанной со следующим минимальным кодом:
#include <iostream>
#include <ucontext.h>
using namespace std;
template <typename T> void foo() {
ucontext_t c;
auto f = [=](int i){ cout << i << endl; };
makecontext(&c, (void (*) (void)) (void (*)(int)) f, 1, 12345);
}
int main(int argc, char *argv[]) {
foo<int>();
return 0;
}
Ошибка:
error: invalid cast from type ‘foo() [with T = int]::<lambda(int)>’ to type ‘void (*)(int)’
Однако, если я удаляю неиспользуемый (в этом примере) аргумент шаблона из функции foo
, он становится void foo();
, и меняем вызов на foo()
, ошибка исчезает. Может кто-нибудь сказать мне, почему? Я использую G ++ 4.6.
Edit:
Из приведенных ниже комментариев кажется, что [=]
в приведенном выше коде делает лямбду «захватывающей» лямбда, несмотря на тот факт, что она на самом деле ничего не захватывает. [=]
не требуется в моем коде, увы, замена на []
в GCC 4.6 не устраняет ошибку. Я сейчас устанавливаю GCC 4.6.1 ...