Maison > développement back-end > C++ > Pourquoi ma compilation C 20 `constexpr` `std::vector` et `std::string` échoue-t-elle ?

Pourquoi ma compilation C 20 `constexpr` `std::vector` et `std::string` échoue-t-elle ?

Patricia Arquette
Libérer: 2024-12-01 20:05:14
original
759 Les gens l'ont consulté

Why Are My C  20 `constexpr` `std::vector` and `std::string` Failing Compilation?

C 20 Le vecteur et la chaîne Constexpr ne fonctionnent pas ? Une histoire d'allocation transitoire

Lorsque vous essayez de créer des objets constexpr std::string et std::vector, vous pouvez rencontrer une erreur de compilation déroutante. Malgré l'utilisation de la dernière version prise en charge de Visual Studio, le message d'erreur indique « l'expression doit avoir une valeur constante ».

Le problème

Le code fourni utilise :

constexpr std::string cs{ "hello" };
constexpr std::vector cv{ 1, 2, 3 };
Copier après la connexion

Cependant, le compilateur se plaint, suggérant des détails manquants.

Le Solution

Le problème provient de la prise en charge limitée par C 20 de l'allocation constexpr. Plus précisément, une allocation transitoire est requise. Cela signifie que toute mémoire allouée lors de l'évaluation constante doit être libérée avant la fin de l'évaluation.

Les vecteurs, de par la nature de l'allocation dynamique de mémoire, ne peuvent pas être stockés en tant que constantes car leur mémoire persiste après l'évaluation. D'où l'erreur concernant "pointe vers la mémoire qui a été allouée au tas lors d'une évaluation constante."

Exemple d'allocation transitoire

Bien que les vecteurs ne puissent pas être déclarés comme constantes, ils peuvent être utilisé lors des fonctions constexpr avec 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 ce code, la mémoire du vecteur est désallouée lorsque f() renvoie, rendant l'allocation transitoire et lui permettant d'être utilisée dans une fonction 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