Estoy buscando una manera de identificar lambdas vacías (sin captura) de otras lambdas en una función de plantilla. Actualmente estoy usando C ++ 17 pero tengo curiosidad por las respuestas de C ++ 20 también.
Mi código se ve así:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
¿Está garantizado por el estándar C ++ (17 o 20) que una lambda sin captura, que es convertible en un puntero de función, también hará que el std::is_empty
rendimiento sea verdadero?
Tome este código como ejemplo:
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?
+
Parece funcionar aquí .
+lambda
) está bien formada.