Maison >développement back-end >C++ >Pourquoi mon C 20 `constexpr` `std::vector` et `std::string` ne fonctionnent-ils pas ?
Le vecteur et la chaîne constexpr C 20 ne fonctionnent pas
Dans ce numéro, un programmeur tente de créer des objets constexpr de std::string et std ::vecteur, mais rencontre une erreur du compilateur indiquant que l'expression doit avoir une valeur constante. Le problème survient malgré l'utilisation de la dernière version de Microsoft Visual Studio 2019, qui prend en charge les chaînes et les vecteurs constexpr.
Explication du problème
L'erreur provient de la prise en charge limitée de l'allocation constexpr dans C 20, qui permet uniquement une allocation transitoire. L'allocation transitoire nécessite que la mémoire allouée soit complètement libérée avant la fin de l'évaluation constante.
Exemple de code invalide
L'exemple suivant illustre l'erreur :
int main() { constexpr std::vector<int> v = {1, 2, 3}; }
Ici, l'allocation pour v persiste, la rendant non transitoire. Le compilateur produit correctement une erreur indiquant que l'expression n'a pas été évaluée en constante car v conserve une allocation de tas pendant l'évaluation constante.
Exemple de code valide
Cependant , l'utilisation de std::vector pendant le temps constexpr est possible avec une allocation transitoire.
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
Dans cet exemple, l'allocation de v est transitoire puisque le la mémoire est libérée lorsque f() revient. Cela permet l'utilisation de std::vector pendant le temps constexpr.
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!