static_assert Bergantung pada Non-Type Template Parameter: Variasi Gelagat dalam GCC dan Clang
Dalam C , makro static_assert digunakan untuk mengesahkan penyusunan -keadaan masa. Apabila syarat gagal, atur cara ditamatkan dengan mesej ralat.
Pertimbangkan kod berikut:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
Kod ini cuba melumpuhkan instantiasi templat umum dengan static_assert. Walau bagaimanapun, kelakuannya berbeza antara penyusun:
Perspektif Standard
Piawaian C menentukan bahawa templat tidak terbentuk jika tiada pengkhususan yang sah dapat dijana dan ia tidak dibuat seketika. Dalam kes ini, tiada pengkhususan yang sah untuk templat Hitchhiker, jadi ia tidak betul dari segi teknikal.
Walau bagaimanapun, piawaian tidak memerlukan diagnostik untuk dikeluarkan dalam kes sedemikian.
Pelaksanaan Penyusun
GCC memilih untuk mematuhi piawaian dengan ketat, tidak mengeluarkan diagnostik apabila templat tidak dibuat seketika (kerana ia sudah tidak betul).
Dentang, sebaliknya, memberikan pengalaman yang lebih mesra pengguna dengan mengeluarkan diagnostik walaupun templat tidak dibuat seketika. Ini membantu pembangun mengenal pasti isu yang berpotensi lebih awal dalam proses penyusunan.
Amalan Terbaik
Untuk mengelakkan percanggahan ini, adalah disyorkan untuk mengkhususkan templat secara eksplisit untuk nilai parameter yang diingini bukannya menggunakan static_assert untuk melumpuhkan instantiasi templat umum. Pendekatan ini memastikan tingkah laku yang konsisten merentas penyusun.
Contohnya:
<code class="cpp">template <int> struct Hitchhiker; template <> struct Hitchhiker<42> {};</code>
Atas ialah kandungan terperinci Mengapa Gelagat `static_assert` Berbeza-beza Antara GCC dan Clang Apabila Bergantung pada Parameter Templat Bukan Jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!