Rumah > pembangunan bahagian belakang > C++ > Mengapakah GCC dan Clang Berbeza dalam Gelagat Tegas Statik untuk Templat Tidak Segera?

Mengapakah GCC dan Clang Berbeza dalam Gelagat Tegas Statik untuk Templat Tidak Segera?

Mary-Kate Olsen
Lepaskan: 2024-11-04 19:20:01
asal
825 orang telah melayarinya

Why Do GCC and Clang Differ in Static Assert Behavior for Uninstantiated Templates?

Percanggahan Gelagat Penegasan Statik antara GCC dan Clang

Dalam pengaturcaraan templat, adalah mungkin untuk menguatkuasakan syarat tertentu pada masa penyusunan menggunakan penegasan statik. Walau bagaimanapun, pengkompil yang berbeza boleh mempamerkan variasi dalam tingkah laku mereka semasa menilai pernyataan ini, seperti yang ditunjukkan oleh pemerhatian baru-baru ini.

Pertimbangkan coretan kod berikut:

<code class="cpp">template <int answer> struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template <> struct Hitchhiker<42> {};</code>
Salin selepas log masuk

Dalam contoh ini, kami cuba untuk gunakan penegasan statik untuk melumpuhkan instantiasi templat umum untuk Hitchhiker. Walau bagaimanapun, selepas penyusunan, adalah diperhatikan bahawa clang menjana ralat penegasan walaupun templat tidak dibuat seketika, manakala gcc hanya menghasilkan ralat apabila menginstant Hitchhiker dengan parameter selain daripada 42.

Penyiasatan lanjut mendedahkan bahawa percanggahan ini berpunca daripada sekeping kod berikut:

<code class="cpp">template <int answer> struct Hitchhiker {
  static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer");
};

template <> struct Hitchhiker<42> {};</code>
Salin selepas log masuk

Apabila menyusun dengan kod yang diubah suai ini, kedua-dua penyusun mempamerkan gelagat yang sama: penegasan dicetuskan hanya apabila templat umum dibuat seketika. Tingkah laku ini sejajar dengan piawai C, seperti yang dinyatakan dalam [temp.res]/8:

If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
Salin selepas log masuk

Menurut petikan ini, jika tidak mungkin untuk menjana pengkhususan yang sah untuk templat dan ia tidak disegerakan, templat dianggap tidak berbentuk, tidak memerlukan diagnostik. Dalam kes ini, clang memilih untuk menyediakan diagnostik, manakala gcc tidak.

Untuk menguatkuasakan sekatan untuk hanya membenarkan 42, satu pendekatan ialah menahan diri daripada mentakrifkan templat umum:

<code class="cpp">template <> struct Hitchhiker<42> {};</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah GCC dan Clang Berbeza dalam Gelagat Tegas Statik untuk Templat Tidak Segera?. 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