Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-14 16:22:02
asal
410 orang telah melayarinya

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

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 (*)())([]() {}));
Salin selepas log masuk

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!

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