c ++ 14 introduit des lambdas génériques qui ont permis d'écrire ce qui suit:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Il est très clair que ce lambda générique func
fonctionne exactement comme une fonction basée sur un modèle fonctionnerait func
.
Pourquoi le comité C ++ a-t-il décidé d'ajouter une syntaxe de modèle pour le lamda générique?
c++
c++14
c++20
generic-lambda
codeur3101
la source
la source
Réponses:
Les lambdas génériques C ++ 14 sont un moyen très cool de générer un foncteur avec un
operator ()
qui ressemble à ceci:Mais pas comme ça:
Ni comme ça:
Ni comme ça (bien que cela devienne un peu difficile à utiliser):
Les lambdas C ++ 14 sont bien, mais C ++ 20 nous permet d'implémenter ces cas sans tracas.
la source
(auto a, decltype(a) b)
en C ++ 14.b
n'est pas déduite, et son argument sera implicitement converti au type dea
.Étant donné que vous pouvez utiliser des modèles lambdas en C ++ 20, vous pouvez restreindre vos types de manière plus simple qu'une expression SFINAE:
Ce lambda fonctionnera uniquement avec les types vectoriels.
la source
consteval
lien avec la nouvelle syntaxe? C'est cool et tout, mais je ne comprends pas la pertinence.La proposition qui a été acceptée dans C ++ 20 a une longue section de motivation, avec des exemples. La prémisse est la suivante:
Voici quelques exemples.
la source
(source: itération au moment de la compilation avec C ++ 20 lambdas )
Une autre chose intéressante qui peut être faite sur les lambdas génériques C ++ 14 et C ++ 17 est l'appel direct
operator()
en passant explicitement un paramètre de modèle:C ++ 14:
C ++ 20:
L'exemple C ++ 14 ci-dessus est tout à fait inutile: il n'y a aucun moyen de faire référence au type fourni
operator()
dans le corps du lambda sans donner un nom à l'argument et utiliserdecltype
. De plus, nous sommes obligés de passer un argument même si nous n'en avons peut-être pas besoin.L'exemple C ++ 20 montre comment T est facilement accessible dans le corps du lambda et qu'un lambda nul peut désormais être modelé de manière arbitraire. Cela va être très utile pour l'implémentation des constructions de compilation susmentionnées
la source