Maison >développement back-end >C++ >Pourquoi `data1.size()` ne fonctionne-t-il pas dans une fonction `constexpr` avec des paramètres de référence ?

Pourquoi `data1.size()` ne fonctionne-t-il pas dans une fonction `constexpr` avec des paramètres de référence ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-29 07:53:13611parcourir

Why Doesn't `data1.size()` Work in a `constexpr` Function with Reference Parameters?

Expressions constantes dans les fonctions Constexpr avec paramètres de référence

Considérez l'extrait de code suivant :

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: non-type template argument is not a constant expression
    ...
}

Lors de la compilation à l'aide clang 6.0 avec -std=c 17, la fonction ne parvient pas à se compiler en raison de la fonction membre size de le tableau n'est pas constexpr lorsqu'il est appliqué à une référence.

Raison d'être du standard

La raison de ce comportement est expliquée dans [expr.const]/4 de la norme C :

  • Une expression n'est pas une expression constante de base si elle évalue une expression d'identifiant 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 une initialisation précédente et est utilisable dans des expressions constantes
    • La durée de vie de la référence a commencé lors de l'évaluation de l'expression

Dans ce cas, le paramètre de référence data1 n'a pas d'initialisation précédente, il ne peut donc pas être utilisé dans l'expression constante data1.size() data2.size().

Solution

Pour résoudre le problème, remplacez simplement data1.size() par le paramètre de modèle S1 :

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