Tegas Statik dengan Parameter Templat Bukan Jenis
Dalam C , static_assert digunakan untuk menyemak keadaan pada masa penyusunan. Walau bagaimanapun, pengkompil yang berbeza mempamerkan gelagat yang berbeza-beza apabila menggunakan static_assert dengan parameter templat bukan jenis.
Masalah:
Coretan kod berikut:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
menghasilkan hasil yang berbeza apabila disusun menggunakan GCC dan Clang. Dalam GCC, ralat penegasan hanya dijana apabila membuat seketika Hitchhiker dengan parameter selain daripada 42. Dalam Clang, ralat penegasan dijana walaupun apabila templat tidak dijadikan seketika.
Mengubah suai penegasan seperti berikut:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
menghasilkan tingkah laku yang konsisten antara kedua-dua penyusun, dengan penegasan hanya disemak semasa instantiasi templat.
Jawapan:
Mengikut standard C ( [temp.res]/8), templat tidak nyata tanpa pengkhususan yang sah dianggap tidak betul, tanpa memerlukan diagnostik.
Kesimpulan:
Dalam dalam kes kod asal, GCC memilih untuk tidak mengeluarkan diagnostik untuk templat yang tidak segera. Clang, sebaliknya, memutuskan untuk mengeluarkan diagnostik walaupun standard tidak memerlukannya. Tingkah laku kod yang diubah suai adalah lebih konsisten antara pengkompil kerana penegasan hanya disemak apabila templat benar-benar dibuat seketika.
Adalah penting untuk ambil perhatian bahawa kehadiran atau ketiadaan diagnostik dalam senario ini tidak menunjukkan ralat dalam kod. Templat yang tidak dibuat secara semula jadi adalah bentuk yang tidak betul, dan sebarang percubaan untuk mewujudkannya dengan pengkhususan yang tidak sah akan mengakibatkan ralat penyusunan.
Atas ialah kandungan terperinci Mengapakah `static_assert` dengan Parameter Templat Bukan Jenis Berkelakuan Berbeza dalam GCC dan Clang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!