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
Mary-Kate Olsenoriginal
2024-12-15 17:57:15933parcourir

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

    // ...
}

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;

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