Mon idiome préféré pour cela est:
auto f = [](auto&& x){myfunction(decltype(x)(x));}
que je lis comme " x
comme le type x
a été déclaré comme ".
Pour voir comment cela fonctionne, examinez ce qui se passe lorsque x
est un int&&
. decltype(x)(x)
est (int&&)(x)
, ce qui produit une référence rvalue à x
. Si x
est un int&
, alors nous obtenons (int&)(x)
qui est un cast noop à une référence. Rappelez-vous, decltype(x)
inclut la catégorie de référence.
Maintenant, pour les paramètres est plus courte, mais auto&&
équivalent à:
auto f = [](auto&& x){myfunction(std::forward<decltype(x)>(x));}
l'alternative.
Pour auto
paramètres:
auto f = [](auto x){myfunction(decltype(x)(x));}
il induit une copie supplémentaire, tandis que
auto f = [](auto x){myfunction(std::forward<decltype(x)>(x));}
au lieu de se déplace-x
.
Alors que je traite habituellement de style C jette comme étant trop dangereux, decltype(x)(x)
peut, au pire, faire une copie de type correct de x
si x
n'est pas une variable auto&&
. Et il y a quelque chose à dire pour la brièveté de celui-ci.
Il existe une [proposition pour C++ 2a] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0428r0.pdf) pour créer des lambdas avec des modèles d'opérateur d'appel un peu plus facile à écrire. –
Lien intéressant. Cela ne vaudrait-il pas la peine de mettre le lien directement dans la réponse? – skypjack
@skypjack: Étant donné la nature ténue et spéculative des premières propositions, et le fait que la question concerne le C++ 14, j'ai pensé qu'il valait mieux laisser un commentaire. Peut-être qu'une fois la décision prise, nous pourrons mettre à jour ceci (juillet?). –