Penilaian static_assert Gelagat dalam Templat Instantiation
Dalam kod ini, static_assert digunakan untuk mengesahkan nilai parameter templat bukan jenis jawab. Walau bagaimanapun, gelagat penegasan ini berbeza antara gcc dan clang:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
Gelagat gcc:
gcc hanya mencetuskan penegasan apabila menginstant Hitchhiker dengan parameter selain daripada 42.
Gelagat clang:
clang menimbulkan ralat penegasan walaupun templat tidak dinyatakan secara eksplisit.
Tafsiran Standard:
Piawaian C menyatakan bahawa jika templat tidak mempunyai pengkhususan yang sah dan tidak dijadikan instantiated, templat tersebut dianggap salah bentuk. Ini bermakna tiada diagnostik diperlukan.
Analisis:
Kedua-dua penyusun adalah betul dalam tingkah laku mereka. Clang memilih untuk menyediakan diagnostik walaupun piawaian tidak memerlukannya.
Pendekatan Alternatif:
Untuk membenarkan jawapan sebanyak 42 sahaja, templat umum boleh ditinggalkan , dan templat khusus yang ditakrifkan seperti berikut:
<code class="cpp">template <> struct Hitchhiker<42> {};</code>
Atas ialah kandungan terperinci Adakah Gelagat `static_assert` Berbeza-beza dalam Instantiasi Templat Antara GCC dan Clang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!