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) }
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
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!