Maison > développement back-end > C++ > Pourquoi est-ce que j'obtiens des erreurs du compilateur lors de l'utilisation de « constexpr std :: vector » et « constexpr std :: string » en C 20 ?

Pourquoi est-ce que j'obtiens des erreurs du compilateur lors de l'utilisation de « constexpr std :: vector » et « constexpr std :: string » en C 20 ?

Barbara Streisand
Libérer: 2024-12-01 11:48:10
original
487 Les gens l'ont consulté

Why Do I Get Compiler Errors When Using `constexpr std::vector` and `constexpr std::string` in C  20?

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

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

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!

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