Я ищу способ идентифицировать пустые (без захвата) лямбды из других лямбд в функции шаблона. В настоящее время я использую C ++ 17, но мне тоже интересно узнать ответы на C ++ 20.
Мой код выглядит так:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
Гарантируется ли стандартом C ++ (17 или 20), что лямбда без захвата, которая может быть преобразована в указатель на функцию, также сделает std::is_empty
yield true?
Возьмите этот код в качестве примера:
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
).+
Кажется, здесь работает .Ответы:
Нет, фактически, стандарт явно разрешает лямбдам иметь размер, который не соответствует их объявлению. [expr.prim.lambda.closure] / 2 штатов
акцент мой
Таким образом, это позволяет реализации дать лямбда-члену, даже если он без захвата. Я не думаю, что какая-либо реализация когда-либо могла бы, но им по закону разрешено это делать.
источник