Mencegah Ketaksempurnaan Klausa Constexpr If-Else
Dalam C , seseorang mungkin menghadapi keperluan untuk menegaskan bahawa semua constexpr jika keadaan dalam pernyataan if-else dipenuhi. Tanpa penegasan sedemikian, klausa else boleh diambil secara tidak dijangka.
Pertimbangkan kod berikut:
if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { // I want the else clause never taken. But I heard the code below is not allowed static_assert(false); }
Seseorang mungkin menganggap bahawa klausa else tidak akan diambil kerana semua syarat harus saling eksklusif. Walau bagaimanapun, mengikut piawaian C, penegasan sedemikian tidak dibenarkan.
Penyelesaian: Ketergantungan Templat
Untuk mengelakkan klausa lain daripada diambil, seseorang mesti membuat pernyataan yang dibuang bergantung pada parameter templat. Ini boleh dicapai menggunakan kod berikut:
template <class... T> constexpr std::false_type always_false{}; if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { static_assert(always_false<T>); }
Penaakulan
Piawaian C menyatakan bahawa program tidak terbentuk jika tiada pengkhususan yang sah dapat dijana untuk templat atau substatement dalam templat. Dengan membuat pernyataan yang dibuang bergantung pada parameter templat, pengkompil boleh memastikan bahawa tiada pengkhususan yang sah boleh dijana apabila tiada syarat dipenuhi, dengan berkesan menghalang klausa lain daripada diambil.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Tiada Klausa `else` Pernah Dilaksanakan dalam Rantaian C `constexpr if-else`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!