Rumah > Artikel > pembangunan bahagian belakang > Mengapakah GCC dan Clang Berbeza dalam Gelagat Tegas Statik untuk Templat Tidak Segera?
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!