Rumah > pembangunan bahagian belakang > C++ > Bolehkah C 11 Menentukan sama ada Ungkapan ialah Pemalar Masa Kompilasi?

Bolehkah C 11 Menentukan sama ada Ungkapan ialah Pemalar Masa Kompilasi?

Patricia Arquette
Lepaskan: 2024-12-05 06:04:11
asal
1049 orang telah melayarinya

Can C  11 Determine if an Expression is a Compile-Time Constant?

Adakah constexpr Mungkin dalam C 11?

Soalan:

Bolehkah C 11 menentukan sama ada ungkapan ialah ungkapan pemalar masa kompilasi (constexpr)?

Jawapan:

Ya, adalah mungkin untuk menghasilkan nilai boolean masa kompilasi berdasarkan penentuan ini menggunakan teknik berikut:

template<typename T> 
constexpr typename remove_reference<T>::type makeprval(T &&& t) {
  return t;
}

#define isprvalconstexpr(e) noexcept(makeprval(e))
Salin selepas log masuk

Makro ini menyemak sama ada ungkapan e ialah ungkapan pemalar nilai dengan menggunakan operator noexcept. Jika noexcept(makeprval(e)) menilai kepada benar, ungkapan e ialah ungkapan pemalar nilai.

Penjelasan:

Ungkapan pemalar nilai mempunyai sekatan tertentu:

  • Panggilan fungsi mestilah tidak membaling spesifikasi pengecualian.
  • Ekspresi lontaran adalah dilarang.
  • Balingan dinamik dan ungkapan taip mestilah dalam bentuk yang tidak boleh dibuang.

Fungsi makeprval tidak diisytiharkan sebagai noexcept, jadi jika e ialah ungkapan malar nilai, panggilan makeprval(e) akan menjadi ungkapan malar. Oleh itu, pengendali noexcept akan kembali benar.

Keterbatasan:

Makro isprvalconstexpr mempunyai beberapa had:

  • Ia mungkin menghasilkan negatif palsu dalam kes di mana ungkapan adalah ungkapan malar tetapi sub-ungkapan berpotensi dinilai tetapi tidak sebenarnya dinilai.
  • Ia hanya menyemak ungkapan pemalar nilai, bukan ungkapan konsteks umum.

Atas ialah kandungan terperinci Bolehkah C 11 Menentukan sama ada Ungkapan ialah Pemalar Masa Kompilasi?. 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