Resolusi Kekaburan untuk Lambda Overload Menggunakan Operator Unary Plus
Dalam C , melebihkan fungsi dengan menyediakan berbilang pelaksanaan dengan jenis parameter yang berbeza membolehkan fleksibiliti dalam penggunaan semula kod. Walau bagaimanapun, apabila cuba memanggil fungsi dengan ungkapan lambda, kekaburan boleh timbul jika lambda boleh memenuhi berbilang beban berlebihan.
Isu Kekaburan
Pertimbangkan coretan kod berikut :
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([](){}); // ambiguous }
Panggilan pertama untuk foo dengan ungkapan lambda []() menjadi samar-samar kerana pengkompil tidak dapat menentukan beban berlebihan yang hendak digunakan. Kedua-dua fungsi std:: dan kelebihan penuding fungsi adalah calon yang berdaya maju.
Menyelesaikan Kekaburan dengan Operator Unary Plus
Notasi, dalam kes ini operator tambah unary , boleh digunakan untuk menyelesaikan kekaburan ini. Dengan meletakkan tambah unary sebelum ungkapan lambda, ia memaksa penukaran kepada jenis penuding fungsi:
foo(+[](){});
Penukaran ini menjadikan penuding fungsi membebankan padanan tepat untuk jenis hujah, void (*)() , dan menghapuskan kekaburan.
Operator Unary Plus
Operator unary plus yang ditakrifkan dalam piawaian C mempunyai sifat berikut:
"Operan operator unari hendaklah mempunyai aritmetik, penghitungan tidak berskop atau jenis penunjuk dan hasilnya ialah nilai hujah."
Dalam kes lambda, walaupun tidak mempunyai jenis aritmetik atau penunjuk, ia boleh ditukar kepada batal (*)() disebabkan oleh sifat jenis penutupannya. Jenis penutupan untuk lambda mempunyai fungsi penukaran tidak eksplisit kepada penuding fungsi dengan parameter dan jenis pengembalian yang sama seperti operator panggilan fungsi lambda.
Memilih Lebihan Penunjuk Fungsi
Dengan tambah unary yang memaksa penukaran kepada batal (*)(), beban berlebihan kedua, void foo(void (*f)()), menjadi padanan tepat dalam kedudukan peleraian lebihan. Memandangkan ia adalah satu-satunya padanan tepat, ia dipilih dengan jelas.
Pendekatan Alternatif
Sebagai alternatif, untuk menghantar lambda secara eksplisit kepada jenis penunjuk fungsi untuk mengelakkan kesamaran, satu boleh guna:
foo(static_cast<void (*)()>([](){}));
Atas ialah kandungan terperinci Bagaimanakah Operator Unary Plus Boleh Menyelesaikan Kekaburan Apabila Melebihkan Lambdas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!