Enigma Kelas Tempatan dalam Algoritma STL
Walaupun ungkapan lambda digunakan secara meluas sebagai predikat dalam algoritma STL, kelas tempatan nampaknya misteri dikecualikan daripada utiliti ini. Dalam soalan ini, kami berusaha untuk merungkai sekatan mandat standard yang melarang jenis tempatan daripada mengambil bahagian dalam algoritma STL sebagai predikat.
Larangan Standard
Ketiadaan tempatan kelas sebagai jenis predikat dalam algoritma STL berpunca daripada larangan eksplisit yang dikenakan oleh C 98/03 standard, seperti yang dinyatakan dalam artikel C 03 14.3.1:
"Jenis tempatan, jenis tanpa kaitan, jenis yang tidak dinamakan atau jenis yang dikompaun daripada mana-mana jenis ini tidak boleh digunakan sebagai templat- hujah untuk parameter jenis templat."
Sekatan ini ditunjukkan dalam kod pembenderaan pengkompil seperti contoh yang diberikan, di mana struct setempat tidak boleh digunakan sebagai predikat untuk std::remove_if.
Rasional untuk Sekatan
Rasional untuk pengecualian ini diselubungi dengan tekaan. Sesetengah membuat spekulasi bahawa ia adalah satu kesilapan, manakala yang lain percaya ia bertujuan untuk menghalang definisi jenis ad-hoc dan berkemungkinan mengelirukan dalam algoritma.
Evolusi dalam C 11
Mujurlah, piawaian C 11 membetulkan isu ini, menarik balik sekatan pada jenis tempatan sebagai hujah templat. Akibatnya, penyusun kontemporari biasanya membenarkan penggunaan kelas tempatan sebagai predikat dalam algoritma STL.
Kesimpulan
Walaupun larangan asal pada kelas tempatan merupakan sumber kekecewaan, ia penyingkiran dalam C 11 telah membuka jalan baharu untuk menggunakan jenis tempatan dalam algoritma STL. Hari ini, ekspresi lambda dan kelas tempatan wujud bersama sebagai pilihan predikat yang berkesan, memberikan pembangun alat serba boleh untuk manipulasi algoritma.
Atas ialah kandungan terperinci Mengapa Kelas Tempatan Tidak Boleh Digunakan sebagai Predikat dalam Algoritma STL (C 98/03)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!