Ich suche nach einer Möglichkeit, leere (Captureless) Lambdas von anderen Lambdas in einer Vorlagenfunktion zu identifizieren. Ich verwende derzeit C ++ 17, bin aber auch neugierig auf C ++ 20-Antworten.
Mein Code sieht folgendermaßen aus:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
Wird durch den C ++ - Standard (17 oder 20) garantiert, dass ein nicht erfassbares Lambda, das in einen Funktionszeiger konvertierbar ist, auch die std::is_empty
Ausbeute wahr macht?
Nehmen Sie diesen Code als Beispiel:
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?
+
scheint zu funktionieren hier .
+lambda
) korrekt ist.