Pengenalan:
Ralat pengkompil boleh membingungkan, terutamanya apabila ia timbul daripada panggilan ke fungsi yang nampaknya tidak digunakan. Dalam contoh ini, pernyataan static_assert dalam fungsi templat menyebabkan kegagalan kompilasi walaupun fungsi itu tidak dipanggil secara eksplisit. Artikel ini menyelidiki sebab di sebalik tingkah laku ini dan mencadangkan penyelesaian yang berpotensi.
Fungsi Templat dan Kegagalan Kompilasi:
Fungsi templat di bawah mencetuskan ralat kompilasi:
template <typename T> inline T getValue(AnObject&) { static_assert(false , "this function has to be implemented for desired type"); }
Setelah penyusunan, mesej ralat berikut muncul:
static_assertion failed "this function has to be implemented for the desired type"
Sebab Kegagalan:
Mengikut Standard C (khususnya [temp.res]/8) , definisi templat dianggap tidak betul jika tiada pengkhususan yang sah dapat dijana dan templat itu kekal tidak segera. Dalam kes ini, pengkompil tidak menemui pengkhususan yang sah untuk fungsi templat getValue dan oleh itu menganggapnya tidak betul. Akibatnya, pernyataan static_assert gagal penyusunan, walaupun fungsi belum dipanggil.
Penyelesaian Kemungkinan:
Satu cara yang mungkin untuk mengelakkan ralat kompilasi sambil mengekalkan fungsi yang dimaksudkan ialah menggunakan struct helper:
template<typename T> struct foobar : std::false_type { }; template <typename T> inline T getValue(AnObject&) { static_assert( foobar<T>::value , "this function has to be implemented for desired type"); }
Dengan menggunakan helper struct foobar, pengkompil tidak boleh lagi segera menolak fungsi templat kerana ia tidak dapat menentukan sama ada pengkhususan yang sah bagi foobar dengan nilai == true akan disegerakan kemudian. Apabila fungsi templat akhirnya diwujudkan, pengkhususan foobar yang sesuai dijana dan pernyataan static_assert gagal seperti yang diharapkan.
Atas ialah kandungan terperinci Mengapa `static_assert` Gagal Penyusunan Walaupun Fungsi Templat Tidak Dipanggil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!