Rumah > pembangunan bahagian belakang > C++ > Mengapakah Instantiasi Templat Dua Fasa MSVC Menyimpang daripada Piawaian C?

Mengapakah Instantiasi Templat Dua Fasa MSVC Menyimpang daripada Piawaian C?

Linda Hamilton
Lepaskan: 2024-12-24 14:06:15
asal
182 orang telah melayarinya

Why Does MSVC's Two-Phase Template Instantiation Deviate from the C   Standard?

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:

  • Melaksanakan semakan sintaks dan jenis asas.
  • Tidak mengesahkan pengisytiharan atau kewujudan nama bukan bergantung yang digunakan dalam templat.

Fasa Kedua:

  • Menyelesaikan dan mengikat nama yang tidak bergantung pada pengisytiharan mereka.
  • Melanjutkan carian ruang nama untuk nama tanggungan dengan pengisytiharan terkumpul sejak yang pertama fasa.

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

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

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!

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