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
Mary-Kate Olsenasal
2024-11-04 19:20:01823semak imbas

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>

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>

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.

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>

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!

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