Como o lambda genérico funciona ( auto
palavra-chave como tipo de argumento) no padrão C ++ 14?
É baseado em modelos C ++ onde, para cada tipo de argumento diferente, o compilador gera uma nova função com o mesmo corpo, mas com tipos substituídos (polimorfismo em tempo de compilação) ou é mais semelhante aos genéricos de Java (eliminação de tipo)?
Exemplo de código:
auto glambda = [](auto a) { return a; };
Respostas:
Lambdas genéricos foram introduzidos em
C++14
.Simplesmente, o tipo de fechamento definido pela expressão lambda terá um templated operador de chamada em vez do, sem gabarito operador de call regular de
C++11
lambdas 's (claro, quandoauto
aparece pelo menos uma vez na lista de parâmetros).Então, seu exemplo:
Fará
glambda
uma instância deste tipo:O parágrafo 5.1.2 / 5 do Projeto Padrão C ++ 14 n3690 especifica como o operador de chamada do tipo de fechamento de uma dada expressão lambda é definido:
Finalmente:
Como o parágrafo acima explica, lambdas genéricos são apenas açúcar sintático para functores únicos e não nomeados com um operador de chamada modelado. Isso deve responder a sua pergunta :)
fonte
int main () { struct X {}; std::vector<X> x; }
)Infelizmente , eles não fazem parte do C ++ 11 ( http://ideone.com/NsqYuq ):
Com g ++ 4.7:
No entanto , a forma como pode ser implementado em C ++ 14 de acordo com a proposta de Portland para lambdas genéricos :
Isso resultaria na maior parte da criação usual de uma classe de functor anônima, mas com a falta de tipos, o compilador emitiria um membro modelado-
operator()
:Ou de acordo com a proposta mais recente Proposta para Expressões Lambda Genéricas (Polimórficas)
Então, sim, para cada permutação de parâmetros, uma nova instanciação surgiria, no entanto, os membros desse functor ainda seriam compartilhados (ou seja, os argumentos capturados).
fonte
-std=c++1y
.auto
tem as mesmas regras de dedução do automóvel clássico? Se nos referirmos à analogia do modelo, isso significaria que o automático não é automático, são as mesmas regras da dedução do tipo de modelo. Então a questão é: a dedução do modelo é equivalente aauto
?static
ouregister
:) De qualquer forma, sim, usarauto
significa que, por baixo do capô, um modelo normal é gerado. Na verdade, um lambda será substituído internamente pelo compilador por uma classe de functor, e umauto
parâmetro significa quetemplate <T> ... (T ...)
será emitido.É um recurso proposto do C ++ 14 (não no C ++ 11) semelhante (ou mesmo equivalente) aos modelos. Por exemplo, N3559 fornece este exemplo:
fonte