Maison > développement back-end > C++ > Pourquoi mon C 20 `constexpr` `std::vector` et `std::string` ne fonctionnent-ils pas ?

Pourquoi mon C 20 `constexpr` `std::vector` et `std::string` ne fonctionnent-ils pas ?

Mary-Kate Olsen
Libérer: 2024-12-06 10:42:13
original
544 Les gens l'ont consulté

Why Aren't My C  20 `constexpr` `std::vector` and `std::string` Working?

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};
}
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal