Métaprogrammation avec état : est-ce toujours légal en C
L'une des techniques de métaprogrammation les plus controversées en C, la métaprogrammation avec état, repose sur le concept du compteur constexpr pour stocker et récupérer l'état de métaprogrammation. Dans l’état actuel des choses, cette technique est légale sous C 14. Cependant, cela soulève la question de savoir si cela va changer avec l’introduction de C 17.
Pour comprendre le problème en question, considérons l’implémentation suivante basée sur un message précédent :
// State storage flag template <int N> struct flag { friend constexpr int adl_flag(flag<N>&); constexpr operator int() { return N; } }; // State writer template <int N> struct write { friend constexpr int adl_flag(flag<N>) { return N; } static constexpr int value = N; }; // State reader template <int N, int = adl_flag(flag<N>{})> constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{})) { return R; } // Stateful counter template <int N = 0> constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value) { return R; }
Cette technique est utilisée comme suit :
// Check if counter is stateful with static assertion static_assert(counter() != counter(), "Your compiler is mad at you"); // Template specialization based on counter state template<int = counter()> struct S {}; // Check if template specializations differ with static assertion static_assert(!std::is_same_v<S<>, S<>, "This is ridiculous");
Cependant, la légalité de la métaprogrammation avec état a été remise en question avec le CWG Active Issue 2118. Le numéro propose que l'utilisation d'un ami les fonctions dans les modèles pour capturer et récupérer l'état de la métaprogrammation devraient être considérées comme mal formées en raison de leur nature obscure.
En mai 2015, le CWG a convenu que de telles techniques devraient être interdites, mais n'a pas encore déterminé un mécanisme approprié. Le problème reste actif et jusqu'à ce qu'une décision soit prise, la métaprogrammation avec état restera légale en C . Toutefois, lorsqu'un mécanisme d'interdiction est établi, cette technique peut être déclarée rétroactivement comme un rapport de défaut.
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!