Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah pengendali unari menyelesaikan kekaburan apabila memanggil fungsi dengan ungkapan lambda sebagai hujah?
Menyelesaikan Lebihan Ambiguous dengan Operator Unari untuk Fungsi Lambda
Dalam coretan kod yang disediakan:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // resolves to function pointer overload }
Yang pertama call to foo adalah samar-samar, gagal untuk disusun. Kekaburan ini timbul daripada fakta bahawa ungkapan lambda boleh ditukar secara tersirat kepada kedua-dua std::function
Untuk menyelesaikan kekaburan ini, operator unary digunakan sebelum lambda dalam panggilan kedua. Operator menukar ungkapan lambda kepada jenis penuding fungsi, void (*)(), yang sepadan dengan bebanan kedua dengan tepat.
Mengikut standard C:
Oleh itu, ungkapan []() {} menghasilkan penunjuk fungsi kekosongan (*)(), yang padan dengan jelas dengan lebihan beban kedua.
Adalah penting untuk ambil perhatian bahawa ungkapan lambda boleh juga dihantar secara eksplisit ke jenis penuding fungsi untuk mengelakkan kekaburan:
foo((void (*)())([]() {}));
Atas ialah kandungan terperinci Bagaimanakah pengendali unari menyelesaikan kekaburan apabila memanggil fungsi dengan ungkapan lambda sebagai hujah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!