Я считал где-нибудь, что функция лямбды должна затухнуть к указателю функции, если список получения пуст. Единственная ссылка, которую я могу найти теперь, является n3052. С g ++ (4.5 и 4.6) это работает как ожидалось, если лямбда не объявляется в рамках кода шаблона.
Например, следующие компиляции кода:
void foo() {
void (*f)(void) = []{};
}
Но это больше не компилирует при шаблонной обработке (если foo
на самом деле назван в другом месте):
template
void foo() {
void (*f)(void) = []{};
}
В ссылке выше, я не вижу объяснение этого поведения. Действительно ли это - временное ограничение g ++ и в противном случае является там (технической) причиной не позволить это?
Я не могу придумать причину, по которой это было бы специально запрещено. Я предполагаю, что это просто временное ограничение g++.
Я также попробовал несколько других вещей:
template <class T>
void foo(void (*f)(void)) {}
foo<int>([]{});
Это работает.
typedef void (*fun)(void);
template <class T>
fun foo() { return []{}; } // error: Cannot convert.
foo<int>()();
Это не работает (но работает, если foo
не параметризован).
Примечание: я тестировал только в g++ 4.5.