Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyelesaikan Kekaburan dalam Fungsi Terlalu Beban Apabila Melepasi Lambdas sebagai Argumen dalam C?

Bagaimana untuk Menyelesaikan Kekaburan dalam Fungsi Terlalu Beban Apabila Melepasi Lambdas sebagai Argumen dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-11-19 07:40:03941semak imbas

How to Resolve Ambiguity in Overloaded Functions When Passing Lambdas as Arguments in C  ?

Menyelesaikan Kekaburan dalam Fungsi Terlebih Beban untuk Lambdas

Dalam C , apabila memanggil fungsi dengan lambda sebagai hujah, kekaburan boleh timbul jika terdapat berbilang beban berlebihan yang sepadan dengan jenis lambda. Ini boleh membawa kepada ralat penyusunan.

Pertimbangkan kod berikut:

#include <functional>

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

int main()
{
    foo([](){}); // ambiguous
}

Dalam kod ini, terdapat dua lebihan foo: satu mengambil std::function

Untuk menyelesaikan kekaburan ini, anda boleh menggunakan operator tambah unary ( ) sebelum lambda, seperti yang ditunjukkan di bawah:

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

Operator tambah memaksa penukaran lambda kepada penuding fungsi, membolehkan lebihan kedua foo untuk dipadankan dengan tepat dan dipanggil tanpa kesamaran.

Tingkah laku ini berpunca daripada keupayaan operator unary plus untuk menukar jenis tertentu, termasuk lambdas, kepada penunjuk berfungsi. Fungsi penukaran ini ditakrifkan seperti berikut:

The operand of the unary + operator shall have arithmetic, unscoped enumeration, or pointer type, and the result is the value of the argument.

Memandangkan jenis penutupan lambda mempunyai fungsi penukaran kepada penuding fungsi, operator unary plus menukar lambda kepada jenis penuding fungsi yang diingini, membenarkan pemadanan tepat dalam peleraian beban berlebihan.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kekaburan dalam Fungsi Terlalu Beban Apabila Melepasi Lambdas sebagai Argumen dalam C?. 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