C 20 Le vecteur et la chaîne Constexpr ne fonctionnent pas ? Une histoire d'allocation transitoire
Lorsque vous essayez de créer des objets constexpr std::string et std::vector, vous pouvez rencontrer une erreur de compilation déroutante. Malgré l'utilisation de la dernière version prise en charge de Visual Studio, le message d'erreur indique « l'expression doit avoir une valeur constante ».
Le problème
Le code fourni utilise :
constexpr std::string cs{ "hello" }; constexpr std::vector cv{ 1, 2, 3 };
Cependant, le compilateur se plaint, suggérant des détails manquants.
Le Solution
Le problème provient de la prise en charge limitée par C 20 de l'allocation constexpr. Plus précisément, une allocation transitoire est requise. Cela signifie que toute mémoire allouée lors de l'évaluation constante doit être libérée avant la fin de l'évaluation.
Les vecteurs, de par la nature de l'allocation dynamique de mémoire, ne peuvent pas être stockés en tant que constantes car leur mémoire persiste après l'évaluation. D'où l'erreur concernant "pointe vers la mémoire qui a été allouée au tas lors d'une évaluation constante."
Exemple d'allocation transitoire
Bien que les vecteurs ne puissent pas être déclarés comme constantes, ils peuvent être utilisé lors des fonctions constexpr avec allocation transitoire :
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
Dans ce code, la mémoire du vecteur est désallouée lorsque f() renvoie, rendant l'allocation transitoire et lui permettant d'être utilisée dans une fonction 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!