S: Mengapa argumen templat lalai hanya dibenarkan untuk templat kelas? Mengapa tidak untuk templat fungsi ahli juga?
Contoh:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
Menurut C , argumen templat lalai hanya sah untuk templat kelas.
J: Argumen templat lalai sememangnya berguna. Pertimbangkan fungsi isihan:
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type>> void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
Walau bagaimanapun, rasional untuk sekatan semasa dalam C adalah berakar pada zaman awal bahasa apabila fungsi berdiri bebas dianggap kurang penting. Akibatnya, mereka dikehendaki menyimpulkan semua hujah templat daripada hujah fungsi, menghalang penggunaan nilai lalai.
Had ini menghalang fleksibiliti dan keserasian kod dengan templat fungsi ahli. Untuk membetulkannya, C 0x memperkenalkan argumen templat lalai untuk templat fungsi.
Seperti Bjarne Stroustrup, pencipta C , menyatakan dalam laporan kecacatan:
"Larangan templat lalai argumen untuk templat fungsi ialah peninggalan masa yang salah di mana fungsi berdiri bebas dianggap sebagai warga kelas kedua dan memerlukan semua hujah templat disimpulkan daripada hujah fungsi dan bukannya ditentukan."
"Sekatan secara serius mengecewakan gaya pengaturcaraan dengan tidak perlu membuat fungsi berdiri bebas berbeza daripada fungsi ahli, sekali gus menjadikannya lebih sukar untuk menulis kod gaya STL."
Atas ialah kandungan terperinci Mengapakah Argumen Templat Lalai Hanya Dibenarkan untuk Templat Kelas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!