Static_Assert Failure Walaupun Fungsi Templat Tidak Dipanggil
Dalam C 0x, templat dengan pengisytiharan static_assert yang tidak digunakan boleh mengakibatkan kegagalan kompilasi. Pertimbangkan kod berikut:
template <typename T> inline T getValue(AnObject&) { static_assert(false, "this function has to be implemented for the desired type"); }
Anehnya, kod ini gagal dengan ralat:
static_assertion failed "this function has to be implemented for the desired type"
Secara intuitif, seseorang akan menjangkakan pengkompil hanya membuat seketika fungsi templat jika ia dipanggil. Walau bagaimanapun, piawaian C menyatakan sebaliknya dalam [temp.res]/8:
Tiada diagnostik akan dikeluarkan untuk definisi templat yang mana pengkhususan yang sah boleh dijana. Jika tiada pengkhususan yang sah boleh dijana untuk definisi templat, dan templat itu tidak dibuat seketika, definisi templat adalah tidak betul, tiada diagnostik diperlukan.
Memandangkan tiada pengkhususan sah yang menyusun, pengkompil dibenarkan untuk menolak takrifan templat tanpa mengira sama ada ia dibuat seketika.
Untuk menyelesaikan isu ini, seseorang boleh mentakrifkan semula kod 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 the desired type"); }
Pengubahsuaian ini menangguhkan diagnostik kepada instantiasi foobar
Atas ialah kandungan terperinci Mengapa Penegasan Statik Gagal dalam Fungsi Templat Tidak Dipanggil dalam C 0x?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!