Rumah >pembangunan bahagian belakang >C++ >Bolehkah Kita Tentukan sama ada Ungkapan C 11 ialah `constexpr` pada Masa Kompilasi Tanpa Pengisytiharan?
Menggunakan constexpr dalam C 11: Menentukan Ungkapan Malar
Soalan:
Adakah ia boleh dilaksanakan untuk memastikan sama ada ungkapan C 11 layak sebagai ungkapan malar (constexpr) semasa masa penyusunan tanpa bergantung pada pengisytiharan?
Jawapan:
Menggunakan pengendali noexcept, adalah mungkin untuk membina boolean masa kompilasi yang menunjukkan sama ada ungkapan membentuk a constexpr:
template<typename T> constexpr typename remove_reference<T>::type makeprval(T&& t) { return t; } #define isprvalconstexpr(e) noexcept(makeprval(e))
Penjelasan:
Ungkapan noexcept(e) mengesahkan syarat berikut:
Penghadan:
Disebabkan oleh sifat konservatif ungkapan "berpotensi dinilai", mungkin terdapat keadaan di mana noexcept boleh memberikan negatif palsu. Contohnya:
constexpr int a = (0 ? throw "fooled!" : 42); constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42)); // returns false
Dalam kes ini, a berjaya dimulakan, tetapi atest menilai kepada false kerana ungkapan lontaran berpotensi dinilai, walaupun ia tidak pernah dilaksanakan.
Atas ialah kandungan terperinci Bolehkah Kita Tentukan sama ada Ungkapan C 11 ialah `constexpr` pada Masa Kompilasi Tanpa Pengisytiharan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!