Я шукаю спосіб ідентифікувати порожні (без захоплення) лямбда від інших лямбда в функції шаблону. Зараз я використовую 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
справжній вихід?
Візьміть цей приклад як приклад:
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
добре сформовано перетворення у покажчик функції ( ).