c ++ 14 introduziu lambdas genéricos que tornaram possível escrever o seguinte:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
É muito claro que este lambda genérico func
funciona exatamente como uma função modelo funcionaria func
.
Por que o comitê C ++ decidiu adicionar sintaxe de modelo para lamda genérico?
c++
c++14
c++20
generic-lambda
coder3101
fonte
fonte
Respostas:
Lambdas genéricos do C ++ 14 são uma maneira muito legal de gerar um functor com um
operator ()
semelhante a este:Mas não assim:
Nem assim:
Nem assim (embora seja um pouco complicado de usar):
Lambdas em C ++ 14 estão bem, mas C ++ 20 nos permite implementar esses casos sem complicações.
fonte
(auto a, decltype(a) b)
em C ++ 14.b
não é deduzida e seu argumento será convertido implicitamente para o tipo dea
.Como você pode usar lambdas modelados em C ++ 20, pode restringir seus tipos de uma maneira mais fácil do que uma expressão SFINAE:
Este lambda funcionará apenas com tipos de vetor.
fonte
consteval
relacionado à nova sintaxe? É legal e tudo, mas não entendi a relevância.A proposta que foi aceita no C ++ 20 tem uma longa seção de motivação, com exemplos. A premissa é esta:
A seguir estão alguns exemplos.
fonte
(fonte: iteração em tempo de compilação com C ++ 20 lambdas )
Outra coisa interessante que pode ser feita em lambdas genéricos C ++ 14 e C ++ 17 é chamar diretamente
operator()
, passando explicitamente um parâmetro de modelo:C ++ 14:
C ++ 20:
O exemplo C ++ 14 acima é totalmente inútil: não há como se referir ao tipo fornecido
operator()
no corpo do lambda sem dar um nome ao argumento e usardecltype
. Além disso, somos forçados a passar um argumento, embora possamos não precisar dele.O exemplo C ++ 20 mostra como T é facilmente acessível no corpo do lambda e que um lambda nulo agora pode ser modelado arbitrariamente. Isso vai ser muito útil para a implementação das construções de tempo de compilação mencionadas
fonte