Je cherche un moyen d'identifier les lambdas vides (sans capture) des autres lambdas dans une fonction de modèle. J'utilise actuellement C ++ 17 mais je suis également curieux de connaître les réponses C ++ 20.
Mon code ressemble à ceci:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
Est-il garanti par la norme C ++ (17 ou 20) qu'un lambda sans capture, qui est convertible en pointeur de fonction, rendra également le std::is_empty
rendement vrai?
Prenez ce code comme exemple:
auto a = []{}; // captureless
auto b = [c = 'z']{}; // has captures
static_assert(sizeof(a) == sizeof(b)); // Both are the same size
static_assert(!std::is_empty_v<decltype(b)>); // It has a `c` member
static_assert(std::is_empty_v<decltype(a)>); // Passes. It is guaranteed?
+lambda
) est bien formée.+
semble fonctionner ici .Réponses:
Non, en fait, la norme accorde explicitement la permission aux lambdas d'avoir une taille qui ne correspond pas à leur déclaration. [expr.prim.lambda.closure] / 2 états
mettre l'accent
Cela permet donc à l'implémentation de donner un membre lambda même s'il est sans capture. Je ne pense pas qu'une mise en œuvre le ferait jamais, mais ils sont légalement autorisés à le faire.
la source