Estou procurando uma maneira de identificar lambdas vazias (sem captura) de outras lambdas em uma função de modelo. Atualmente, estou usando C ++ 17, mas estou curioso para respostas C ++ 20 também.
Meu código fica assim:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
É garantido pelo padrão C ++ (17 ou 20) que um lambda sem captura, que é conversível em um ponteiro de função, também tornará o std::is_empty
rendimento verdadeiro?
Tome este código como um exemplo:
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á bem formada.+
parece funcionar aqui .Respostas:
Não, de fato, o padrão concede explicitamente permissão para lambdas ter um tamanho que não esteja alinhado com sua declaração. [expr.prim.lambda.closure] / 2 estados
ênfase minha
Portanto, isso permite que a implementação forneça um membro ao lambda, mesmo que seja sem captura. Eu acho que nenhuma implementação seria, mas eles estão legalmente autorizados a fazê-lo.
fonte