Saya sedang mencari cara untuk mengidentifikasi lambda kosong (tidak bisa ditangkap) dari lambda lain dalam fungsi templat. Saat ini saya menggunakan C ++ 17 tapi saya juga penasaran untuk C ++ 20 jawaban juga.
Kode saya terlihat seperti ini:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
Apakah dijamin oleh standar C ++ (17 atau 20) bahwa lambda yang tidak dapat ditangkap, yang dapat dikonversi ke pointer fungsi, juga akan membuat std::is_empty
hasil menjadi benar?
Ambil kode ini sebagai contoh:
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?
+
tampaknya bekerja di sini .
+lambda
) terbentuk dengan baik.