Mengapa `std::function` Kurang Perbandingan Kesaksamaan?

Patricia Arquette
Lepaskan: 2024-10-30 04:36:28
asal
196 orang telah melayarinya

Why Does `std::function` Lack Equality Comparison?

Merungkai Enigma Perbandingan Kesamaan std::function

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!