Rumah > pembangunan bahagian belakang > C++ > Mengapa Pencarian Bergantung Argumentasi (ADL) Gagal dengan Templat Fungsi Termampat Secara Eksplisit?

Mengapa Pencarian Bergantung Argumentasi (ADL) Gagal dengan Templat Fungsi Termampat Secara Eksplisit?

DDD
Lepaskan: 2024-12-11 04:20:10
asal
623 orang telah melayarinya

Why Does Argument Dependent Lookup (ADL) Fail with Explicitly Instantiated Function Templates?

ADL dan Carian Templat Fungsi

Templat fungsi memainkan peranan penting dalam pengaturcaraan C, membolehkan penggunaan semula kod dan fungsi generik. Walau bagaimanapun, had halus timbul apabila menggunakan Argument Dependent Lookup (ADL) untuk mencari templat fungsi dalam ruang nama tertentu.

Isu ini menjelma sendiri apabila cuba memanggil templat fungsi dengan hujah templat eksplisit, seperti yang digambarkan dalam kod berikut coretan:

namespace ns {
    struct foo {};
    template<int i> void frob(foo const&amp;) {}
    void non_template(foo const&amp;) {}
}

int main() {
    ns::foo f;
    non_template(f); // This is fine.
    frob<0>(f); // This is not.
}
Salin selepas log masuk

Punca di sebalik kegagalan ini berpunca daripada klausa tertentu dalam Piawaian C. Mengikut Piawaian C 03 14.8.1.6, ADL tidak terpakai apabila memanggil templat fungsi dengan hujah templat eksplisit melainkan templat fungsi dengan nama itu kelihatan pada titik panggilan.

Dalam contoh di atas, terdapat tiada templat fungsi bernama frob kelihatan dalam skop semasa apabila frob<0>(f); dipanggil. Oleh itu, ADL tidak dicetuskan dan pengkompil gagal mencari templat fungsi yang diingini.

Untuk memintas pengehadan ini, seseorang boleh menentukan ruang nama secara eksplisit sebelum templat fungsi, seperti yang ditunjukkan di bawah:

ns::frob<0>(f);
Salin selepas log masuk

Dalam kes ini, ADL tidak diperlukan kerana templat fungsi dipanggil terus daripada yang mengandungi ruang nama.

Contoh kod berikut seterusnya menggambarkan kelakuan ADL dengan templat fungsi:

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, templat fungsi f ditakrifkan dalam kedua-dua ruang nama A dan C. Apabila panggil f<3>(b); dibuat, pengkompil terlebih dahulu menyemak skop semasa dan tidak menemui templat f yang kelihatan. ADL kemudiannya digunakan, tetapi kerana f ialah nama yang tidak layak, ia tidak dapat mencari templat fungsi dalam ruang nama lain.

Untuk memanggil templat dari ruang nama C, seseorang mesti melayakkan nama dengan C::f atau menggunakan arahan secara eksplisit seperti yang ditunjukkan dalam kod.

Atas ialah kandungan terperinci Mengapa Pencarian Bergantung Argumentasi (ADL) Gagal dengan Templat Fungsi Termampat Secara 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan