Última atualização:2026-10-12
Expressões Lambda no C++20 (parte 1)¶
Templates de lambda no C++20¶
O C++14 oferece suporte a expressões lambda genéricas, o que permite que uma lambda aceite parâmetros de qualquer tipo, por exemplo:
seria expandida para:
struct Func {
template <typename T1, typename T2>
auto operator()(T1 a, T2 b) const {
return a + b;
}
};
Porém, ela não consegue produzir as expansões abaixo:
Primeiro caso: mesmos tipos
`cpp
template <class T>
auto operator()(T t1, T t2) const;
Segundo caso: apenas std::array
cpp
template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const;
Terceiro caso: sem dedução
template <class T>
auto operator()() const;
As lambdas do C++14 são muito boas, mas o C++20 nos permite realizar esses casos com facilidade. O C++20 permite que expressões lambda usem parâmetros de tipo template em sua definição; a sintaxe básica é a seguinte:
cpp
[]<typename T>(){}
A seguir, alguns exemplos ilustram seus benefícios.
1.Restrição de tipos¶
Em um exemplo como o abaixo, no C++14 podemos escrever o código a seguir; porém, ao usá-lo, o que é passado não é necessariamente um vector e, assim, o comportamento diverge do esperado, gerando erros.
cpp
auto print = [](auto vec) {
for (auto x : vec) {
std::cout << x << std::endl;
}
};
A partir do C++20, podemos restringir o tipo:
cpp
auto print2 = []<typename T>(std::vector<T>& vec){
//使用 std::vector<T> 执行操作
};
Então surge a pergunta, uma questão de entrevista: você sabe como garantir segurança no C++14 para restringir a um vector?
2.Encaminhamento perfeito¶
No C++20, você pode usar o encaminhamento perfeito com muita facilidade; por exemplo:
cpp
auto lambdaFunc = []<typename T>(T&& number) {
processFunction(std::forward<T>(number));
};
Então surge a pergunta: em comparação com o C++14, qual é a vantagem? Ou seja, o que o C++14 precisaria para implementar o encaminhamento perfeito?
Fim desta seção
Tópicos relacionados¶
- Introdução às corrotinas no C++20 | C++那些事
- Prática com channel no C++20 | C++那些事
- Concepts (conceitos) no C++20 | C++那些事
- constexpr e a expressão vírgula no C++20 | C++那些事
- Ordem de bytes (endian) no C++20 | C++那些事
- Módulos (Modules) no C++20 | C++那些事
- Biblioteca Ranges do C++20 | C++那些事
- Design e armadilhas do std::span no C++20 | C++那些事
- Guia dos novos recursos do C++20 | C++那些事
- [[likely]] e [[unlikely]] no C++20 | C++那些事