Vecteurs et chaînes Constexpr en C 20 : résolution des erreurs du compilateur
Lors de la tentative de création d'objets constexpr std::string et std::vector , vous pouvez rencontrer une erreur du compilateur indiquant que l'expression n'a pas de valeur constante. Malgré l'utilisation de la dernière version de Microsoft Visual Studio 2019, qui prend en charge les chaînes et les vecteurs constexpr, cette erreur peut persister.
Allocation transitoire par rapport à l'allocation non transitoire
Le problème découle du fait que le soutien à l'allocation constexpr dans le C 20 est limité aux allocations transitoires. Les allocations transitoires sont libérées à la fin de l'évaluation constante, empêchant la persistance de l'allocation.
Dans votre cas, l'utilisation de std :: vector et std :: string implique une allocation de mémoire dynamique, qui n'est pas transitoire. . Par conséquent, le compilateur signale cela comme une violation de la restriction d'allocation transitoire.
constexpr std::vector cv{ 1, 2, 3 };
Solution pour l'allocation transitoire dans Constexpr
Pour résoudre ce problème et utiliser des vecteurs ou chaînes dans constexpr, assurez-vous que l’allocation est transitoire. Cela signifie que l'allocation de mémoire doit être complètement libérée avant la fin de l'évaluation constante.
Par exemple, vous pouvez utiliser une fonction pour effectuer l'allocation dans constexpr, comme dans l'exemple suivant :
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
Dans ce cas, l'allocation du vecteur est transitoire car la mémoire est désallouée au retour de la fonction. 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!