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
Libérer: 2024-12-04 02:30:09
original
556 Les gens l'ont consulté

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;

    // ...
}
Copier après la connexion

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;

    // ...
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal