Rumah >pembangunan bahagian belakang >C++ >Mengapa Nilai Titik Terapung Tidak Boleh Digunakan sebagai Parameter Templat C?
Apabila cuba membuat instantiate templat kelas generik dengan nilai apungan sebagai parameter lalai, pengkompil boleh mengeluarkan ralat. Walaupun nilai integer berfungsi seperti yang diharapkan, terapung tidak berfungsi.
Menurut piawai C 11 (14.3.2/1), argumen templat bukan jenis untuk bukan -parameter templat jenis mesti mematuhi peraturan tertentu. Satu sekatan ialah ia tidak boleh menjadi nilai titik terapung. Sebaliknya, ia mestilah sama ada jenis kamiran atau penghitungan, ungkapan pemalar yang ditukar bagi jenis parameter templat atau binaan khusus lain.
Penghadan ini mungkin berpunca daripada sifat pengiraan titik terapung yang tidak tepat. Mewakili nilai titik terapung dengan tepat tidak selalu boleh dilaksanakan, membawa kepada potensi ketidaktepatan yang boleh menyebabkan tingkah laku yang tidak dijangka. Pertimbangkan contoh berikut:
func<1/3.f>(); func<2/6.f>();
Walaupun bertujuan untuk memanggil fungsi yang sama dua kali, perwakilan titik terapung 1/3 dan 2/6 tidak dijamin sama kerana kemungkinan ralat pembundaran. Ini boleh membawa kepada seruan fungsi yang tidak diingini.
Jika matlamatnya adalah untuk mewakili nilai titik terapung dalam beberapa cara sebagai hujah templat, satu pilihan ialah menggunakan ungkapan malar C 11 (constexpr) . Ini membenarkan pengiraan pengangka dan penyebut nilai titik terapung pada masa penyusunan, yang kemudiannya boleh dihantar sebagai hujah integer yang berasingan.
Walau bagaimanapun, adalah penting untuk menentukan ambang untuk memastikan nilai titik terapung hampir dengan setiap yang lain berkongsi pasangan samamenumerator/penyebut. Jika tidak, rasional di sebalik mengehadkan nilai titik terapung sebagai argumen templat bukan jenis kekal sah.
Atas ialah kandungan terperinci Mengapa Nilai Titik Terapung Tidak Boleh Digunakan sebagai Parameter Templat C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!