Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Operator Unary Plus Menyelesaikan Kekaburan dalam Fungsi Lebihan dengan Ungkapan Lambda?

Bagaimanakah Operator Unary Plus Menyelesaikan Kekaburan dalam Fungsi Lebihan dengan Ungkapan Lambda?

Barbara Streisand
Lepaskan: 2024-11-16 01:38:02
asal
284 orang telah melayarinya

How does the Unary Plus Operator Resolve Ambiguity in Function Overloading with Lambda Expressions?

Resolusi Kekaburan dalam Fungsi Terlebih Muatan Menggunakan Unary Plus

Dalam coretan kod yang diberikan:

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

int main() {
    foo([]() {}); // ambiguous
    foo(+[]() {}); // not ambiguous (calls the function pointer overload)
}
Salin selepas log masuk

Panggilan pertama untuk menipu dengan ungkapan lambda sebagai hujah yang gagal disusun kerana kekaburan. Walau bagaimanapun, panggilan kedua dengan unary sebelum lambda menyelesaikan kepada kelebihan penuding fungsi.

Peranan Unary Plus

Operator yang digunakan dalam [] ialah unary tambah operator. Ia ditakrifkan dalam standard C sebagai menukar operan aritmetik, penghitungan tidak berskop atau jenis penuding kepada nilai operan.

Dalam kes ini, walaupun ungkapan lambda bukan jenis aritmetik, ia boleh ditukarkan kepada jenis penuding fungsi.

Penukaran kepada Penunjuk Fungsi Taip

Mengikut piawaian C, ungkapan lambda tanpa tangkapan lambda mempunyai fungsi penukaran awam kepada penunjuk untuk berfungsi dengan parameter yang sama dan jenis pengembalian seperti operator panggilan fungsi lambda.

Oleh itu, unary memaksa penukaran ungkapan lambda kepada jenis penunjuk fungsi, batal (*)().

Resolusi Lebihan Beban

Lebih beban kedua, void foo(void (*f)()), menjadi padanan tepat dalam resolusi lebihan kerana jenis argumen, void (*)(), sepadan dengan jenis parameter. Lebihan pertama, void foo(std::function f), bukanlah padanan yang tepat.

Akibatnya, lebihan kedua dipilih dengan jelas, menyelesaikan kesamaran dalam panggilan pertama .

Pertimbangan

Sementara muslihat untuk menyelesaikan kekaburan beban lampau tidak dinyatakan secara eksplisit dalam piawaian C, ia secara amnya dianggap sebagai tingkah laku yang boleh dipercayai.

Walau bagaimanapun, adalah disyorkan untuk menggunakan hantaran eksplisit kepada jenis penunjuk fungsi untuk mengelakkan sebarang kemungkinan kekeliruan atau masa hadapan perubahan dalam tafsiran piawai.

Atas ialah kandungan terperinci Bagaimanakah Operator Unary Plus Menyelesaikan Kekaburan dalam Fungsi Lebihan dengan Ungkapan Lambda?. 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