Pemasangan Templat Dua Fasa dalam Microsoft Visual C : Apakah Isunya?
Microsoft Visual C (MSVC) telah dikritik kerana dakwaannya pelaksanaan instantiasi templat dua fasa yang salah. Metodologi ini, seperti yang ditakrifkan oleh standard C, terdiri daripada dua fasa yang berbeza:
Fasa Pertama:
Fasa Kedua:
Kekurangan MSVC:
Isu utama MSVC terletak pada kegagalannya melakukan carian awal (fasa pertama) untuk ungkapan tidak bergantung. Sebaliknya, ia menangguhkan semua carian sehingga fasa kedua, membawa kepada tingkah laku yang tidak betul. Selain itu, fasa kedua MSVC tidak menghormati spesifikasi untuk carian bukan ADL dengan betul, yang tidak sepatutnya dilanjutkan semasa fasa ini.
Contoh:
Pertimbangkan kod 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 harus mengikat panggilan 'foo(0)' ke 'foo(void*)' semasa fasa pertama. Walau bagaimanapun, MSVC tersalah mengikatnya kepada 'foo(int)' semasa fasa kedua, mengakibatkan ralat semasa pemula.
Lapisan Kesalahan Tambahan:
Walaupun semasa fasa kedua, MSVC gagal mematuhi ketetapan standard bahawa carian bukan ADL tidak boleh dilanjutkan. Ini mengakibatkan kemasukan pengisytiharan yang tidak tersedia semasa fasa pertama, membawa kepada tingkah laku yang tidak dijangka.
Contoh:
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); }
Di sini, 'bar(t )' harus memutuskan untuk 'void bar(void ),' walaupun telah diselesaikan semasa fasa kedua. Namun, MSVC tersilap menyelesaikannya untuk 'kosongkan bar(N::S s),' menunjukkan pelaksanaannya yang salah.
Kesimpulan:
MSVC dua- pelaksanaan instantiasi templat fasa gagal mematuhi piawaian C sepenuhnya, mengakibatkan tingkah laku yang tidak betul apabila berurusan dengan kedua-dua ungkapan tidak bergantung dan carian bukan ADL. Kekurangan ini boleh membawa kepada ralat masa kompilasi yang tidak dijangka dan tingkah laku program.
Atas ialah kandungan terperinci Mengapakah Instantiasi Templat Dua Fasa MSVC Menyimpang daripada Piawaian C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!