Deve o lambda decair para funcionar como ponteiro no código modelado?

9

Eu li em algum lugar que uma função lambda deve decair para funcionar ponteiro se a lista de captura estiver vazia. A única referência que posso encontrar agora é n3052 . Com g ++ (4.5 & amp; 4.6) funciona como esperado, a menos que o lambda seja declarado dentro do código do modelo.

Por exemplo, o código a seguir compila:

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

Mas não compila mais quando tem modelos (se foo for realmente chamado em outro lugar):

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

Na referência acima, não vejo uma explicação para esse comportamento. Esta é uma limitação temporária de g + + e, se não, existe uma razão (técnica) para não permitir isso?

    
por rafak 01.07.2010 в 09:38
fonte

1 resposta

3

Não consigo pensar em nenhuma razão para que isso seja especificamente proibido. Eu estou supondo que é apenas uma limitação temporária de g + +.

Eu também tentei algumas outras coisas:

template <class T>
void foo(void (*f)(void)) {}

foo<int>([]{});

Isso funciona.

typedef void (*fun)(void);

template <class T>
fun foo() { return []{}; } // error: Cannot convert.

foo<int>()();

Isso não acontece (mas se foo não é parametrizado).

Nota: eu só testei em g ++ 4.5.

    
por Peter Alexander 01.07.2010 / 10:33
fonte