Maison >développement back-end >C++ >Comment puis-je résoudre les erreurs « L'argument de modèle non-type n'est pas une expression constante » dans les fonctions Constexpr avec des références ?

Comment puis-je résoudre les erreurs « L'argument de modèle non-type n'est pas une expression constante » dans les fonctions Constexpr avec des références ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-04 02:30:09597parcourir

How Can I Resolve

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 :

  • N'a pas de préfixe initialisation
  • A été créée avant l'évaluation de l'expression constante

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn