Rumah >pembangunan bahagian belakang >C++ >Mengapa Penegasan Statik Gagal dalam Fungsi Templat Tidak Dipanggil?
Pertimbangkan fungsi templat berikut:
template <typename T> inline T getValue(AnObject&) { static_assert(false, "this function has to be implemented for desired type"); }
Apabila menyusun dengan g 4.6.3, walaupun tidak memanggil fungsi ini di mana-mana sahaja, kompilasi gagal dengan ralat:
static_assertion failed "this function has to be implemented for the desired type"
Tingkah laku ini mungkin menimbulkan persoalan, kerana fungsi itu tidak digunakan dan tidak sepatutnya mencetuskan ralat kompilasi. Walau bagaimanapun, menurut piawaian C dalam [temp.res]/8:
If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
Memandangkan tiada cara yang boleh dilaksanakan untuk membuat instantiate templat fungsi dengan pengkhususan yang sah yang akan disusun, definisi templat itu sendiri dianggap kurang bentuk badan. Ini membolehkan pengkompil menolaknya walaupun sebelum sebarang instantiasi berlaku.
Untuk menyelesaikan isu ini dan membenarkan pengesanan ralat tertunda, fungsi templat boleh diubah suai seperti berikut:
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 templat tambahan struct foobar sebagai bendera masa kompilasi, pengkompil tidak boleh segera menolak templat fungsi. Apabila disegerakan, pengkhususan yang berkaitan foobar
Atas ialah kandungan terperinci Mengapa Penegasan Statik Gagal dalam Fungsi Templat Tidak Dipanggil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!