Rumah >pembangunan bahagian belakang >C++ >Apakah yang Membentuk 'Konteks Segera' dalam C 11 SFINAE?

Apakah yang Membentuk 'Konteks Segera' dalam C 11 SFINAE?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-10 18:12:11799semak imbas

What Constitutes the

Apakah Sebenarnya "Konteks Segera" dalam C 11 SFINAE?

Konsep "konteks segera" adalah penting dalam Penggantian C 11 Failure Is Not an Error (SFINAE) simpulan bahasa. Menurut Piawaian C 11, hanya jenis dan ungkapan yang tidak sah "dalam konteks terdekat" bagi jenis fungsi dan jenis parameter templatnya boleh mengakibatkan kegagalan potongan.

Pemahaman Awal

Standard memberikan petunjuk terhad dalam nota: "penilaian jenis dan ungkapan yang digantikan boleh mengakibatkan kesan sampingan seperti pengkhususan templat kelas, fungsi pengkhususan templat, penjanaan fungsi tersirat, dll." Kesan sampingan ini tidak dianggap sebagai sebahagian daripada "konteks segera".

Prosedur Keputusan

Untuk menentukan sama ada ralat penggantian berlaku dalam "konteks segera", ikuti ini prosedur:

  1. Kenal pasti Templat dan Fungsi yang Diperlukan: Pertimbangkan semua templat dan fungsi yang ditakrifkan secara tersirat diperlukan untuk penggantian hujah.
  2. Langkah Pra-Instansiasi: Bayangkan menjana templat dan fungsi ini sebelum penggantian.
  3. Ralat Langsung: Jika sebarang ralat berlaku semasa langkah pra-penyegerakan ini, ia tiada dalam konteks serta-merta dan mengakibatkan ralat penyusunan keras.
  4. Kegagalan Potongan: Jika pra-instansi berjaya, sebarang ralat seterusnya semasa penggantian bukanlah ralat tetapi mengakibatkan kegagalan potongan.

Konkrit Contoh

  • Contoh 1 (Ralat Keras):
template<typename T>
void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
  • Contoh 2 ( Potongan Kegagalan):
template<typename T>
void func(typename T::type* arg);
template<>
struct A<char> {};
func<A<char>>(nullptr); // T::type* is not defined, leading to a deduction failure.

Kesimpulan

"Konteks segera" merujuk kepada ungkapan dan jenis yang boleh diselesaikan tanpa memerlukan penjanaan templat atau fungsi tambahan melebihi langkah pra-instansi yang diperlukan. Ralat yang berlaku dalam peringkat pra-instansi ini mengakibatkan ralat kompilasi keras, manakala ralat dalam peringkat penggantian seterusnya menyebabkan kegagalan potongan.

Atas ialah kandungan terperinci Apakah yang Membentuk 'Konteks Segera' dalam C 11 SFINAE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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