Mengesan Ungkapan Malar dalam C 11
Dalam C 11, adalah mungkin untuk menentukan sama ada ungkapan ialah ungkapan malar (constexpr) semasa kompilasi, yang boleh memberi manfaat untuk mengoptimumkan kod dan memastikan tertentu sifat.
Menggunakan noexcept(makeprval(e))
Salah satu cara untuk menentukan sama ada ungkapan ialah ungkapan malar ialah menggunakan makro berikut:
#define isprvalconstexpr(e) noexcept(makeprval(e))
di mana makeprval ialah fungsi templat yang mengambil rujukan kepada ungkapan sebagai input dan mengembalikan nilai yang sama taip.
Penjelasan
Ungkapan noexcept(e) mengembalikan palsu jika e mengandungi operasi tertentu yang tidak dibenarkan dalam ungkapan tetap, seperti panggilan fungsi bukan melontar, ungkapan lontaran, dan balingan dinamik boleh atau taip. Jika panggilan ke makeprval bukan ungkapan malar, ungkapan noexcept juga akan kembali palsu.
Penghadan
Walaupun isprvalconstexpr secara amnya berkesan dalam mengesan ungkapan malar nilai, ia mempunyai batasan yang halus. Ia mungkin memberikan negatif palsu dalam kes di mana ungkapan ialah ungkapan malar tetapi mengandungi subungkapan yang berpotensi dinilai yang tidak dibenarkan dalam ungkapan malar.
Penggunaan Contoh
Contoh berikut menunjukkan penggunaan isprvalconstexpr:
constexpr int a = (0 ? throw "fooled!" : 42); constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42));
Dalam contoh ini, atest adalah palsu kerana ungkapan (0 ? throw "fooled!" : 42) bukan ungkapan yang berterusan, walaupun permulaan a berjaya. Ini kerana subungkapan tidak tetap "jahat" membuang "diperdayakan!" berpotensi dinilai, walaupun ia tidak pernah dinilai dalam kes khusus ini.
Atas ialah kandungan terperinci Adakah Ekspresi C 11 Saya `constexpr`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!