В моем предыдущем вопросе заключался в том, что неприятное «двойное приведение» может потребоваться для использования POSIX makecontext
с C ++ лямбда-функция (т.е. функциональный объект). Двигаясь дальше, я столкнулся с ошибкой компиляции, связанной со следующим минимальным кодом:
#include
#include
using namespace std;
template 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();
return 0;
}
Ошибка:
error: invalid cast from type ‘foo() [with T = int]::’ to type ‘void (*)(int)’
Однако, если я удалю неиспользуемый (в этом примере) аргумент шаблона из foo
, поэтому она становится void foo ();
, а при изменении вызова на foo ()
ошибка исчезает. Может кто-нибудь сказать мне, почему? Я использую G ++ 4.6.
Изменить:
Из комментариев ниже кажется, что [=]
в приведенном выше коде приводит к тому, что лямбда является «захватывающей» лямбдой, независимо от факт, что он на самом деле ничего не захватывает. [=]
не требуется в моем коде, увы, замена на []
в GCC 4.6 не устраняет ошибку. Я сейчас устанавливаю GCC 4.6.1 ...