Bolehkah std::function Signatures Ditukar Selepas Permulaan?

Patricia Arquette
Lepaskan: 2024-11-06 05:25:02
asal
885 orang telah melayarinya

Can std::function Signatures Be Changed After Initialization?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Teka-teki berpunca daripada fakta bahawa kedua-dua std::function dan std::function boleh dimulakan dengan kedua-dua x dan y. Ini kerana pengisytiharan pembina Microsoft Visual Studio (VS2010) dan GCC (v. 4.5) untuk fungsi std:: membenarkan pengamulaan dengan pelbagai entiti.

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>
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!