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

DDD
Lepaskan: 2024-11-15 02:19:02
asal
700 orang telah melayarinya

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

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan