Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah pengendali unari menyelesaikan kekaburan apabila memanggil fungsi dengan ungkapan lambda sebagai hujah?

Bagaimanakah pengendali unari menyelesaikan kekaburan apabila memanggil fungsi dengan ungkapan lambda sebagai hujah?

Patricia Arquette
Patricia Arquetteasal
2024-11-14 16:22:02331semak imbas

How does the unary   operator resolve ambiguity when calling a function with a lambda expression as an argument?

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 dan void (*f)().

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:

  • Operator unary menukar hujah kepada jenis asasnya (aritmetik, penghitungan atau penuding).
  • Untuk ungkapan lambda, fungsi penukaran dalam jenis penutupan secara eksplisit menukar kepada penuding fungsi dengan parameter dan jenis pulangan yang sama.

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!

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