Rumah > Artikel > pembangunan bahagian belakang > Bolehkah std::function Signatures Ditukar Selepas Permulaan?
Memahami Kekaburan: Adakah Tandatangan std::function Tidak Boleh Berubah?
Dalam alam C , templat std::function biasanya digunakan untuk merangkum objek boleh dipanggil dan penunjuk fungsi. Walau bagaimanapun, kekaburan yang pelik timbul apabila menggunakan templat ini dengan fungsi tandatangan yang berbeza-beza. Mari kita selidiki sebab asas di sebalik kekeliruan ini.
Punca Kekaburan
Inti isu ini terletak pada sifat tandatangan std::function yang kelihatan boleh berubah. Pertimbangkan coretan kod berikut:
<code class="cpp">int a(const std::function<int()>& f) { return f(); } int a(const std::function<int(int)>& f) { return f(0); }</code>
Secara intuitif, apabila menggunakan a(x) atau a(y), dengan x ialah fungsi yang tidak mengambil hujah dan y ialah fungsi yang mengambil satu hujah, kami menjangkakan penyelesaian yang tidak jelas kepada lebihan fungsi yang sesuai. Walau bagaimanapun, pengkompil menghadapi dilema:
<code class="cpp">a(x); // Ambiguous a(y); // Ambiguous</code>
Teka-teki berpunca daripada fakta bahawa kedua-dua std::function
Taip Pemadaman, Pesalah
Untuk memahami fenomena ini, kami memperkenalkan konsep pemadaman jenis, teknik yang digunakan oleh fungsi std::/boost:: untuk membolehkan pengkapsulan fungsi dan objek sewenang-wenangnya. Walaupun ia membenarkan fleksibiliti, ia memperkenalkan potensi untuk penukaran yang samar-samar.
Apabila pengkompil cuba mengenal pasti fungsi yang sesuai untuk set terbeban, ia cuba menukar argumen yang dibekalkan menggunakan sama ada pembina parameter fungsi atau penukaran argumen pengendali. Dalam kes kami, pembina parameter fungsi (iaitu, std::function) menerima hampir apa sahaja, yang membawa kepada kekaburan semasa percubaan penukaran.
Jadi, Adakah Tandatangan Boleh Berubah?
Kesimpulannya, tandatangan std::function memainkan peranan dalam menentukan jenisnya semasa pengisytiharan dan definisi. Walau bagaimanapun, ia tidak mengawal proses permulaan, yang mengakibatkan pemerhatian menarik terhadap tandatangan yang kelihatan boleh berubah.
Penyelesaian untuk Kekaburan
Untuk mengelakkan kekaburan, seseorang boleh menggunakan hantaran eksplisit:
<code class="cpp">a((std::function<int()>)(x)); a((std::function<int(int)>)(y));</code>
Sebagai alternatif, seseorang boleh menggunakan objek fungsi atau menggunakan pengaturcaraan meta templat (TMP) untuk menghapuskan keperluan untuk hantaran eksplisit. Walaupun TMP menawarkan penyelesaian verbose, ia menyembunyikan operasi pemutus daripada klien.
Secara keseluruhan, memahami mekanisme pemadaman jenis dan perbezaan antara jenis semasa pengisytiharan dan pemulaan dalam std::fungsi adalah penting untuk mengelakkan kekaburan dalam fungsi sedemikian. senario.
Atas ialah kandungan terperinci Bolehkah std::function Signatures Ditukar Selepas Permulaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!