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
Libérer: 2024-11-29 07:53:13
original
646 Les gens l'ont consulté

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
    ...
}
Copier après la connexion

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;
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