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?
+lambda
) korrekt ist.+
scheint zu funktionieren hier .Antworten:
Nein, tatsächlich gewährt der Standard Lambdas ausdrücklich die Erlaubnis, eine Größe zu haben, die nicht mit ihrer Deklaration übereinstimmt. [expr.prim.lambda.closure] / 2 Zustände
Betonung meiner
Auf diese Weise kann die Implementierung dem Lambda ein Mitglied geben, auch wenn es ohne Erfassung ist. Ich glaube nicht, dass eine Implementierung dies jemals tun würde, aber sie dürfen dies gesetzlich tun.
quelle