Rumah > pembangunan bahagian belakang > C++ > Mengapa Carian Bergantung Argumen (ADL) Gagal Mencari Templat Fungsi dengan Argumen Templat Eksplisit?

Mengapa Carian Bergantung Argumen (ADL) Gagal Mencari Templat Fungsi dengan Argumen Templat Eksplisit?

Susan Sarandon
Lepaskan: 2024-12-11 12:42:12
asal
414 orang telah melayarinya

Why Does Argument-Dependent Lookup (ADL) Fail to Find Function Templates with Explicit Template Arguments?

ADL dan Templat Fungsi

Pencarian bergantung pada hujah (ADL) memainkan peranan penting dalam C dengan memudahkan carian automatik fungsi dan objek dalam ruang nama yang berkaitan berdasarkan jenis hujah yang digunakan. Walau bagaimanapun, mekanisme ini mempunyai pengehadan apabila ia melibatkan templat fungsi.

Sekatan untuk Mencari Templat Fungsi dengan ADL

Panggilan terakhir dalam coretan kod yang disediakan gagal dikompilasi kerana kepada sekatan dalam spesifikasi C. Menurut Seksyen 14.8.1.6 Piawaian C 03:

"Tetapi apabila templat fungsi dengan hujah templat eksplisit digunakan, panggilan itu tidak mempunyai bentuk sintaksis yang betul melainkan terdapat templat fungsi dengan nama itu boleh dilihat pada titik panggilan."

Ini bermakna ADL hanya boleh mencari templat fungsi yang boleh dilihat dalam skop panggilan. Dalam contoh yang diberikan, frob<0> ialah panggilan ke templat fungsi dengan hujah templat eksplisit. Walau bagaimanapun, tiada pengisytiharan templat frob yang kelihatan pada titik panggilan dalam utama.

Perbezaan daripada Nama Fungsi Ringkas

Sekatan tidak terpakai kepada ringkas nama fungsi. Untuk nama sedemikian, ADL digunakan walaupun fungsi itu tidak kelihatan dalam skop panggilan. Ini kerana panggilan itu masih mengekalkan bentuk sintaksis panggilan fungsi.

Contoh

Contoh berikut menggambarkan tingkah laku dengan lebih lanjut:

namespace A {
  struct B { };
  template<int X> void f(B);
}
namespace C {
  template<class T> void f(T t);
}
void g(A::B b) {
  f<3>(b);    //ill-formed: not a function call
  A::f<3>(b); //well-formed
  C::f<3>(b); //ill-formed; argument dependent lookup
              // applies only to unqualified names
  using C::f;
  f<3>(b);    //well-formed because C::f is visible; then
              // A::f is found by argument dependent lookup
}
Salin selepas log masuk

Dalam contoh ini, panggilan ke f<3>(b) tidak terbentuk kerana tiada templat fungsi yang boleh dilihat bernama f wujud pada masa itu titik. Panggilan ke A::f<3>(b) dibentuk dengan baik kerana templat f boleh dilihat dalam ruang nama A. Panggilan ke C::f<3>(b) adalah tidak betul kerana ADL hanya digunakan untuk nama yang tidak layak. Menggunakan arahan penggunaan kepada alias C::f menjadikan panggilan ke f<3>(b) terbentuk dengan baik kerana nama f kini kelihatan pada titik panggilan.

Atas ialah kandungan terperinci Mengapa Carian Bergantung Argumen (ADL) Gagal Mencari Templat Fungsi dengan Argumen Templat Eksplisit?. 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