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
Barbara Streisandoriginal
2024-12-01 11:48:10581parcourir

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

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

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!

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