Rumah >pembangunan bahagian belakang >C++ >Adakah Ekspresi C 11 Saya `constexpr`?

Adakah Ekspresi C 11 Saya `constexpr`?

Linda Hamilton
Linda Hamiltonasal
2024-12-02 20:32:15164semak imbas

Is My C  11 Expression a `constexpr`?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn