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 ?
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 :
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!