Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan Kekaburan dalam Pemuatan Penunjuk Fungsi dengan Ungkapan Lambda?

Bagaimana untuk Menyelesaikan Kekaburan dalam Pemuatan Penunjuk Fungsi dengan Ungkapan Lambda?

Barbara Streisand
Barbara Streisandasal
2024-11-20 00:20:03529semak imbas

How to Resolve Ambiguity in Function Pointer Overloading with Lambda Expressions?

Menyelesaikan Kekaburan dalam Penunjuk Fungsi Lebihan Pemuatan dengan Ungkapan Lambda Menggunakan Operator Unary Plus

Melebihkan fungsi dengan penuding fungsi dan std::fungsi boleh membawa kepada kekaburan apabila cuba menyampaikan ungkapan lambda sebagai hujah. Kekaburan ini berpunca daripada fakta bahawa ungkapan lambda boleh ditukar secara tersirat kepada kedua-dua penunjuk fungsi dan std::functions.

Untuk menyelesaikan kekaburan ini, operator tambah unary ( ) boleh digunakan sebelum ungkapan lambda. Pengendali memaksa lambda untuk ditukar kepada jenis penuding fungsi, yang dalam kes ini adalah tidak sah ()(). Ini membenarkan resolusi beban lampau untuk memilih dengan jelas fungsi penuding beban berlebihan foo(void (f)()).

Kod berikut menunjukkan penggunaan operator untuk menyelesaikan kekaburan:

#include <functional>

void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }

int main() {
    foo([]() {}); // ambiguous
    foo(+[]() {}); // not ambiguous (calls the function pointer overload)
}

Dengan memahami peraturan penukaran jenis untuk ungkapan lambda dan kesan operator unary plus, kami boleh menyelesaikan kekaburan dalam fungsi dengan berkesan penuding terlebih beban apabila menghantar ungkapan lambda sebagai argumen.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kekaburan dalam Pemuatan Penunjuk Fungsi dengan Ungkapan Lambda?. 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