Rumah > pembangunan bahagian belakang > C++ > Mengapa Microsoft Visual C Gagal Melaksanakan Instantiasi Templat Dua Fasa dengan Betul?

Mengapa Microsoft Visual C Gagal Melaksanakan Instantiasi Templat Dua Fasa dengan Betul?

Linda Hamilton
Lepaskan: 2024-12-07 21:56:12
asal
205 orang telah melayarinya

Why Does Microsoft Visual C   Fail to Correctly Implement Two-Phase Template Instantiation?

Misteri Instasiasi Templat Dua Fasa "Rosak" dalam Microsoft Visual C

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;
}
Salin selepas log masuk

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 :

  1. Ia memanjangkan carian bukan ADL dengan pengisytiharan terkumpul semasa kedua fasa.
  2. Ia salah menyelesaikan ungkapan bergantung, seperti bar(t) dalam kod di bawah, kepada pengisytiharan yang hanya kelihatan semasa fasa kedua.
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(&amp;s);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan