Maison > développement back-end > C++ > Pourquoi les paramètres de référence provoquent-ils des erreurs dans les fonctions Constexpr ?

Pourquoi les paramètres de référence provoquent-ils des erreurs dans les fonctions Constexpr ?

Mary-Kate Olsen
Libérer: 2024-12-15 17:57:15
original
931 Les gens l'ont consulté

Why Do Reference Parameters Cause Errors in Constexpr Functions?

Confusion sur les paramètres de référence dans les fonctions Constexpr

L'extrait de code ci-dessous tente de concaténer deux tableaux d'octets dans un nouveau tableau au sein d'une fonction constexpr nommé concatenate.

template <size_t S1, size_t S2>
auto concatenate(const std::array<uint8_t, S1> &data1,
                 const std::array<uint8_t, S2> &data2)
{
    std::array<uint8_t, data1.size() + data2.size()> result; // Error occurs here

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

Cependant, lorsqu'il est compilé avec Clang 6.0 en utilisant Selon la norme C 17, une erreur se produit : "l'argument de modèle non-type n'est pas une expression constante." Cette erreur provient de la nature de référence des paramètres de fonction (data1 et data2).

Le type de référence dans le paramètre de fonction déclenche un problème car les expressions constantes ne peuvent pas évaluer les références, comme indiqué dans la norme C sous [expr. const]/4 :

"Une expression e est une expression constante de base à moins que l'évaluation de e... évalue une expression id qui fait référence à une variable ou à un membre de données de type référence, sauf si la référence a un initialisation précédente."

Étant donné que les paramètres de référence dans ce cas n'ont pas d'initialisation précédente, ils ne peuvent pas être utilisés dans une expression constante.

Pour remédier à ce problème, le code peut être modifié pour utilisez les paramètres de modèle S1 et S2 directement au lieu de vous fier à la fonction membre size() des paramètres de référence :

std::array<uint8_t, S1 + S2> result;
Copier après la connexion

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