Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Operator Unary Plus Boleh Menyelesaikan Kekaburan Apabila Melebihkan Lambdas dalam C ?

Bagaimanakah Operator Unary Plus Boleh Menyelesaikan Kekaburan Apabila Melebihkan Lambdas dalam C ?

DDD
DDDasal
2024-11-15 02:19:02787semak imbas

How Can the Unary Plus Operator Resolve Ambiguity When Overloading Lambdas in C  ?

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!

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