Vecteurs et chaînes constexpr C 20 : un dilemme d'allocation transitoire
Malgré la norme C 20 introduisant la prise en charge de constexpr pour les vecteurs et les chaînes, les développeurs peuvent rencontrez des erreurs de compilation inattendues lorsque vous tentez de créer des objets constexpr de ces types.
Dans Dans l'exemple ci-dessous, le compilateur génère une erreur indiquant que l'expression nécessite une valeur constante :
#include <vector> #include <string> int main() { constexpr std::string cs{ "hello" }; constexpr std::vector cv{ 1, 2, 3 }; return 0; }
Bien que Visual Studio 2019 version 16.11.4 prétend prendre en charge les vecteurs et les chaînes constexpr, ce problème provient d'une limitation dans Sémantique d'allocation constexpr de C 20.
Contrairement aux variables constexpr, les conteneurs constexpr C 20 ne prennent en charge que les transitoires allocation. Cela signifie que la mémoire allouée lors de l'évaluation constante doit être entièrement libérée avant la fin de l'évaluation. Cependant, les vecteurs nécessitent intrinsèquement une allocation de mémoire dynamique, ce qui entrave leur capacité à répondre à cette exigence.
Par conséquent, ce code est considéré comme mal formé car l'allocation de vecteur persiste :
constexpr std::vector<int> v = {1, 2, 3};
Cependant, l'allocation transitoire peut toujours être utilisée dans des contextes constexpr. Prenons cet exemple :
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
Dans ce cas, l'allocation de mémoire du vecteur est transitoire car la mémoire est libérée lorsque f() revient. Ainsi, il est permis d'utiliser std::vectors lors des évaluations constexpr, à condition que l'allocation soit transitoire.
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!