Rumah > pembangunan bahagian belakang > C++ > Bolehkah Kita Tentukan sama ada Ungkapan C 11 ialah `constexpr` pada Masa Kompilasi Tanpa Pengisytiharan?

Bolehkah Kita Tentukan sama ada Ungkapan C 11 ialah `constexpr` pada Masa Kompilasi Tanpa Pengisytiharan?

Susan Sarandon
Lepaskan: 2024-12-02 12:58:11
asal
1034 orang telah melayarinya

Can We Determine if a C  11 Expression is `constexpr` at Compile Time Without Declarations?

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))
Salin selepas log masuk

Penjelasan:

Ungkapan noexcept(e) mengesahkan syarat berikut:

  • Ketiadaan panggilan fungsi dengan spesifikasi pengecualian bukan melontar atau panggilan berubah-ubah yang tidak membentuk ungkapan tetap.
  • Tidak kehadiran ungkapan "lempar".
  • Tiada balingan dinamik atau typeid dalam bentuk boleh lempar.

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
Salin selepas log masuk

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!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan