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
Mary-Kate Olsenoriginal
2024-12-06 10:42:13541parcourir

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};
}

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!

Déclaration:
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