Pernyataan Masalah:
Pengguna biasa menyatakan kebimbangan bahawa Microsoft Visual C (MSVC) bergelut dengan melaksanakan instantiasi templat dua fasa dengan betul. Apakah aspek khusus mekanisme yang gagal berfungsi seperti yang dijangkakan?
Latar Belakang:
Instasiasi templat dua fasa melibatkan semakan sintaks awal yang dilaporkan dilakukan oleh MSVC. Walau bagaimanapun, keraguan timbul sama ada semakan ini mengesahkan sama ada nama yang digunakan dalam templat diisytiharkan dengan sewajarnya.
Penjelasan:
Sememangnya, semakan sintaks awal MSVC adalah terhad dalam skop. Ia gagal menyemak kehadiran nama yang diisytiharkan, yang membawa kepada isu kompilasi apabila nama kekurangan pengisytiharan yang betul.
Untuk menggambarkan ini, pertimbangkan contoh berikut:
int foo(void*); template<typename T> struct S { S() { int i = foo(0); } }; void foo(int); int main() { S<int> s; }
Pengkompil yang mematuhi standard akan menyelesaikan panggilan foo(0) semasa fasa pertama dan mengikatnya kepada foo(void*). Walau bagaimanapun, MSVC menangguhkan proses ini ke fasa kedua, mengikat foo(0) kepada foo(int) secara salah dan mengakibatkan ralat.
Selain itu, pelaksanaan MSVC bagi fasa kedua menyimpang daripada spesifikasi bahasa dalam dua cara :
namespace N { struct S {}; } void bar(void *) {} template <typename T> void foo(T *t) { bar(t); } void bar(N::S *s) {} int main() { N::S s; foo(&s); }
Dalam kedua-duanya kes, tingkah laku MSVC melanggar pemisahan yang ditentukan antara fasa pertama dan kedua instantiasi templat. Pelaksanaan yang salah ini berterusan dalam Visual Studio 2015.
Atas ialah kandungan terperinci Mengapa Microsoft Visual C Gagal Melaksanakan Instantiasi Templat Dua Fasa dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!