Функция шаблона вызывает ошибку компилятора при использовании с локальной лямбдой

В моем предыдущем вопросе заключался в том, что неприятное «двойное приведение» может потребоваться для использования 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 ...

5
задан Community 23 May 2017 в 11:55
поделиться