Должен ли лямбда распадаться на указатель функции в шаблонном коде? - PullRequest
9 голосов
/ 01 июля 2010

Я где-то читал, что лямбда-функция должна переходить в указатель на функцию, если список захвата пуст.Единственная ссылка, которую я могу найти сейчас, это n3052 .С g ++ (4.5 и 4.6) он работает как положено, если лямбда не объявлена ​​в коде шаблона.

Например, компилируется следующий код:

void foo() {
    void (*f)(void) = []{};
}

Но он больше не компилируетсяпри шаблонизации (если foo фактически вызывается в другом месте):

template<class T>
void foo() {
    void (*f)(void) = []{};
}

В приведенной выше ссылке я не вижу объяснения этому поведению.Является ли это временным ограничением g ++, и если нет, то есть (техническая) причина, по которой это не разрешается?

1 Ответ

3 голосов
/ 01 июля 2010

Я не могу думать ни о какой причине, что это было бы специально запрещено.Я предполагаю, что это просто временное ограничение 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>()();

Это не't (но имеет место, если foo не параметризован).

Примечание: я тестировал только в g ++ 4.5.

...