Rumah >pembangunan bahagian belakang >C++ >Mengapa C Tidak Dapat Menyimpulkan Argumen Templat daripada Argumen Fungsi Lalai?
Penolakan Argumen Templat daripada Argumen Fungsi Lalai
Dalam C , pengaturcara sering menghadapi senario di mana mereka perlu menyimpulkan hujah templat daripada panggilan fungsi. Walau bagaimanapun, mungkin terdapat kes di mana potongan ini gagal, yang membawa kepada ralat pengkompil. Satu kes sedemikian ialah ketidakupayaan untuk menyimpulkan parameter jenis templat daripada argumen fungsi lalai.
Pertimbangkan coretan kod berikut:
<code class="cpp">struct foo { template <typename T> void bar(int a, T b = 0.0f) { } }; int main() { foo a; a.bar(5); }</code>
Setelah menyusun kod ini, pengkompil mungkin menghasilkan ralat yang menyatakan, "tidak dapat menyimpulkan hujah templat untuk T." Untuk menyelesaikan isu ini, seseorang perlu menyatakan hujah templat secara eksplisit dalam panggilan fungsi, seperti a.bar
Dalam C 03, spesifikasi bahasa secara eksplisit melarang penggunaan argumen lalai untuk menyimpulkan hujah templat. Menurut C 03 §14.8.2/17, "Parameter jenis templat tidak boleh disimpulkan daripada jenis argumen lalai fungsi."
Dalam C 11, bahasa memperkenalkan ciri baharu yang membenarkan penyediaan lalai hujah templat untuk templat fungsi:
<code class="cpp">template <typename T = float> void bar(int a, T b = 0.0f) { }</code>
Walau bagaimanapun, hujah templat lalai adalah wajib. Jika ia tidak disediakan, pengkompil masih melarang penggunaan argumen fungsi lalai untuk potongan hujah templat. C 11 §14.8.2.5/5 menyatakan bahawa:
"Parameter templat yang digunakan dalam jenis parameter parameter fungsi yang mempunyai argumen lalai yang sedang digunakan dalam panggilan untuk potongan argumen sedang dilakukan" ialah konteks yang tidak disimpulkan.
Ringkasnya, sambil menyediakan argumen lalai untuk parameter fungsi boleh memudahkan kod, adalah penting untuk memahami batasan potongan hujah templat dalam kes sedemikian. Argumen lalai hanya boleh digunakan untuk potongan argumen templat jika argumen templat lalai diberikan secara eksplisit.
Atas ialah kandungan terperinci Mengapa C Tidak Dapat Menyimpulkan Argumen Templat daripada Argumen Fungsi Lalai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!