Teka-teki:
Mengapa std::function, komponen penting pangkalan kod C moden, tidak dikurniakan keupayaan perbandingan kesaksamaan? Soalan ini telah membingungkan pengaturcara sejak penubuhannya, membawa kepada kekeliruan dan kesukaran dalam menguruskan koleksi objek boleh panggil.
Kekaburan Awal:
Dalam draf awal C 11 standard, lebihan beban untuk operator== dan operator!= telah diisytiharkan tetapi dipadamkan, meninggalkan kekosongan yang tidak pernah dijelaskan dengan secukupnya. Komen yang disertakan "tutup kemungkinan lubang dalam sistem jenis" membayangkan kecacatan tersembunyi, tetapi sifatnya kekal misteri.
Loophole and the Safeguard:
The "loophole" yang disyaki berpunca daripada kehadiran fungsi penukaran boolean. Dengan ketiadaan pengendali perbandingan kesaksamaan yang jelas, fungsi ini boleh membenarkan perbandingan tersirat melalui == atau !=. Walau bagaimanapun, kelemahan ini boleh membawa kepada tingkah laku yang tidak dijangka, seperti yang ditunjukkan oleh:
<code class="cpp">struct S { operator bool() { return false; } }; int main() { S a, b; bool are_equal(a == b); // Uses operator bool on a and b! }</code>
C 03 memperkenalkan simpulan bahasa safe-bool dan C 11 melaksanakan fungsi penukaran bool yang jelas untuk mengelakkan kelemahan ini.
Kontras dengan std::shared_ptr:
Tidak seperti std::function, std::shared_ptr mempunyai semantik kesamaan yang jelas. Dua penunjuk adalah sama jika kedua-duanya kosong atau jika kedua-duanya tidak kosong dan menunjuk ke objek yang sama. Takrifan yang jelas ini membenarkan pelaksanaan pengendali perbandingan kesamaan dalam std::shared_ptr.
Enigma Terurai:
Rasional untuk tidak menjadikan std::fungsi kesamaan setanding berpunca daripada cabaran yang wujud untuk mentakrifkan kriteria kesaksamaan yang bermakna untuk jenis boleh panggil sewenang-wenangnya. Jika dikuatkuasakan, ia akan membebankan semua pelaksana objek fungsi, dan ia masih boleh membawa kepada perbandingan yang samar-samar disebabkan perbezaan dalam hujah yang mengikat. Tambahan pula, ketiadaan pengendali kesaksamaan secara berkesan menutup kelemahan yang timbul daripada penukaran tersirat.
Atas ialah kandungan terperinci Mengapa `std::function` Kurang Perbandingan Kesaksamaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!