Лямбда должна затухнуть к указателю функции в шаблонном коде?

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

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

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

Но это больше не компилирует при шаблонной обработке (если foo на самом деле назван в другом месте):

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

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

9
задан Georg Fritzsche 6 August 2010 в 04:22
поделиться

1 ответ

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

3
ответ дан 5 December 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: