jika constexpr dalam C 17 Tidak Berfungsi dalam Fungsi Bukan Templat
Pengenalan
The Piawaian C 17 memperkenalkan konstruk if constexpr, yang membenarkan pelaksanaan bersyarat berdasarkan ungkapan malar. Walau bagaimanapun, telah diperhatikan bahawa jika tingkah laku constexpr berbeza apabila digunakan dalam fungsi templat berbanding bukan templat.
Masalah
Pertimbangkan fungsi bukan templat berikut:
<code class="cpp">void print() { auto value = 100; if constexpr (std::is_pointer_v<decltype(value)>){ std::cout << "Ptr to " << *value << std::endl; // Error } else { std::cout << "Ref to " << value << std::endl; } }</code>
Kod ini mengakibatkan ralat kompilasi kerana *nilai tidak sah untuk int jenis yang disimpulkan.
Jawapan
Tingkah laku ini adalah mengikut reka bentuk. Dalam fungsi templat, jika constexpr boleh mengelakkan cawangan instantiate yang tidak sah untuk pengkhususan templat tertentu. Walau bagaimanapun, dalam fungsi bukan templat, jika constexpr tidak menyekat kompilasi cawangan yang tidak diambil.
Kedua-dua cabang pernyataan if constexpr dihuraikan dan dianalisis, walaupun cawangan tidak diambil adalah tidak sah. Oleh itu, dalam kod di atas, pengkompil akan cuba menilai *nilai untuk jenis int, mengakibatkan ralat.
Kesimpulan
Perbezaan ini penting untuk difahami apabila menggunakan if constexpr. Dalam fungsi bukan templat, ia hanya boleh digunakan untuk menyemak ungkapan malar yang dijamin sah untuk semua kemungkinan nilai parameter input.
Atas ialah kandungan terperinci Mengapa `jika constexpr` Tidak Berfungsi Seperti Yang Dijangkakan dalam Fungsi C Bukan Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!