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
Patricia Arquetteasal
2024-12-05 06:04:111003semak imbas

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))

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:
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