Poszukuję sposobu na identyfikację pustych (niewychwyconych) lambd z innych lambd w funkcji szablonu. Obecnie używam C ++ 17, ale jestem również ciekawy odpowiedzi na C ++ 20.
Mój kod wygląda następująco:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
Czy standard C ++ (17 lub 20) gwarantuje, że bezbarwna lambda, którą można przekształcić we wskaźnik funkcji, również sprawi, że std::is_empty
wydajność będzie prawdziwa?
Weź ten kod jako przykład:
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
) jest poprawnie sformułowana.+
wydaje się, że tutaj działa .Odpowiedzi:
Nie, w rzeczywistości standard wyraźnie zezwala, aby lambdas miały rozmiar niezgodny z ich deklaracją. [expr.prim.lambda.closure] / 2 stany
mój nacisk
Pozwala to więc implementacji na przekazanie lambda członka, nawet jeśli nie jest on przechwytywany. Nie sądzę, aby jakakolwiek implementacja kiedykolwiek, ale są one prawnie dozwolone.
źródło