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
Susan Sarandonasal
2024-12-02 12:58:11961semak imbas

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

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

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