Référencement de paramètres non constants dans les fonctions Constexpr
Considérez le modèle de fonction suivant :
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Error in constexpr contexts due to reference parameter std::array<uint8_t, data1.size() + data2.size()> result; // ... }
Utilisation de Clang 6.0 avec C 17, ce code ne parvient pas à se compiler avec l'erreur "l'argument de modèle non-type n'est pas un expression constante." L'évaluation des références dans les fonctions constexpr est problématique en raison de problèmes d'alias potentiels.
Comprendre la norme
Selon la norme C ([expr.const]/4), un L'expression ne peut pas être une expression constante de base si elle est évaluée à une référence qui :
Solution
Pour résoudre ce problème, on peut remplacer le paramètre de référence problématique avec son paramètre de modèle correspondant :
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Problem solved by using S1 + S2 instead std::array<uint8_t, S1 + S2> result; // ... }
En utilisant directement les paramètres du modèle, nous éliminons le besoin d'évaluer les références dans des contextes constexpr et assurez-vous que la fonction peut être utilisée dans les évaluations d'expressions constantes.
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!