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?
+lambda
) terbentuk dengan baik.+
tampaknya bekerja di sini .Jawaban:
Tidak, pada kenyataannya, standar secara eksplisit memberikan izin untuk lambdas untuk memiliki ukuran yang tidak sesuai dengan deklarasi mereka. [expr.prim.lambda.closure] / 2 menyatakan
penekanan milikku
Jadi ini memungkinkan implementasi untuk memberikan lambda anggota bahkan jika itu kurang penangkapan. Saya tidak berpikir implementasi apa pun akan pernah, tetapi mereka diizinkan secara hukum untuk melakukannya.
sumber