Static_Asserts dans les blocs Constexpr If en échec : une analyse
En C 17, les instructions constexpr if fournissent un moyen d'exécuter du code de manière conditionnelle au moment de la compilation . Cependant, le comportement de static_asserts au sein de la branche false de telles déclarations a soulevé des inquiétudes.
Le problème vient de la règle qui interdit l'instanciation d'un modèle contenant un static_assert dont la condition est non dépendante et est évaluée à false ( [temp.res]/8). Cette règle garantit la sécurité des types en empêchant un comportement non défini dans les extensions ultérieures du modèle.
Dans le contexte d'une instruction constexpr if, cela signifie que les static_asserts dans la fausse branche sont intrinsèquement mal formés si leur condition est non dépendante. En effet, le compilateur ne peut pas déterminer au moment de la compilation si une spécialisation valide peut être générée pour le modèle contenant le static_assert.
Par exemple, le code suivant est mal formé :
void f() { if constexpr (false) static_assert(false); // ill-formed }
De même, les static_asserts dans les fonctions du modèle constexpr dans la fausse branche sont également mal formées :
template<class T> void g() { if constexpr (false) static_assert(false); // ill-formed }
Cette règle s'étend aux appels aux fonctions constexpr ou aux fonctions de modèle qui appellent static_asserts. De tels appels dans la fausse branche d'une instruction constexpr if sont interdits, même s'ils ne contiennent pas eux-mêmes d'asserts statiques.
Cette interdiction limite l'utilité des instructions constexpr if, car elle oblige les développeurs à examiner méticuleusement le code pour garantir l'absence de static_asserts dans la fausse branche. Cependant, les static_asserts avec des conditions dépendantes qui peuvent être évaluées comme vraies pour au moins un type sont toujours autorisés dans les instructions constexpr if.
En conclusion, la nature mal formée des static_asserts dans les blocs constexpr if échoués est une conséquence de la règle générale qui interdit aux modèles de contenir des static_asserts avec des conditions non dépendantes qui sont évaluées comme fausses. Il est crucial que les développeurs respectent cette règle pour éviter les comportements indéfinis et maintenir la sécurité des types dans leur code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!