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
969 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!

sumber:php.cn
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