Rumah >pembangunan bahagian belakang >C++ >Apa yang Mentakrifkan 'Konteks Segera' dalam C 11 SFINAE?

Apa yang Mentakrifkan 'Konteks Segera' dalam C 11 SFINAE?

DDD
DDDasal
2024-12-12 20:17:11239semak imbas

What Defines

Konteks Segera dalam C 11 SFINAE

Piawaian C 11 mentakrifkan SFINAE (Kegagalan Penggantian Bukan Ralat) sebagai teknik untuk membolehkan secara bersyarat atau melumpuhkan kod berdasarkan potongan hujah templat. Bahagian 14.8.2/8 menggariskan syarat kegagalan penggantian untuk mengakibatkan ralat kompilasi "keras" atau ralat "lembut" yang membawa kepada SFINAE.

Standard merujuk kepada "konteks segera" dalam bahagian ini , menunjukkan bahawa hanya jenis dan ungkapan yang tidak sah dalam konteks segera jenis fungsi dan jenis parameter templatnya boleh menyebabkan kegagalan potongan. Walau bagaimanapun, takrifan "konteks segera" tidak jelas.

Prosedur Keputusan untuk Konteks Segera

Untuk menentukan sama ada ralat penggantian berlaku dalam konteks segera, pertimbangkan berikut:

Bayangkan semua templat dan fungsi yang ditakrifkan secara tersirat diperlukan untuk penggantian hujah templat dihasilkan terlebih dahulu. Sebarang ralat yang berlaku semasa penyediaan ini tidak berada dalam konteks segera dan akan mengakibatkan ralat penyusunan yang sukar.

Jika langkah penyediaan berjaya diselesaikan, sebarang ralat seterusnya semasa penggantian (cth., merujuk kepada templat instan atau fungsi yang ditakrifkan secara tersirat dalam tandatangan templat fungsi) tidak membentuk ralat tetapi mengakibatkan potongan kegagalan.

Contoh

  • Contoh 1:

    template<typename T>
    void func(typename T::type* arg);
    
    template<typename>
    void func(...);
    
    template<typename T>
    struct A { typedef T* type; };
    
    func<A<int&>>(...);

    Dalam contoh ini, instantiating A semasa penyediaan gagal kerana penunjuk kepada rujukan tidak dibenarkan. Memandangkan ralat ini berlaku sebelum penggantian, ia mengakibatkan ralat penyusunan keras.

  • Contoh 2:

    template<typename T>
    void func(typename T::type* arg);
    
    template<typename>
    void func(...);
    
    template<typename T>
    struct A { typedef T* type; };
    
    template<>
    struct A<char> {};
    
    func<A<char>>(...);

    Dalam contoh ini, langkah penyediaan berjaya membuat seketika A. Semasa penggantian, A::type tidak wujud, tetapi ralat ini berlaku selepas fasa penyediaan dan hanya membawa kepada kegagalan potongan hujah dan penggunaan fungsi sandaran.

Atas ialah kandungan terperinci Apa yang Mentakrifkan '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