Maison > développement back-end > C++ > Pourquoi les vecteurs et les chaînes « constexpr » en C 20 entraînent-ils des erreurs d'allocation transitoires ?

Pourquoi les vecteurs et les chaînes « constexpr » en C 20 entraînent-ils des erreurs d'allocation transitoires ?

Linda Hamilton
Libérer: 2024-12-03 06:20:14
original
302 Les gens l'ont consulté

Why Do `constexpr` Vectors and Strings in C  20 Lead to Transient Allocation Errors?

Vecteurs et chaînes constexpr C 20 : un dilemme d'allocation transitoire

Malgré la norme C 20 introduisant la prise en charge de constexpr pour les vecteurs et les chaînes, les développeurs peuvent rencontrez des erreurs de compilation inattendues lorsque vous tentez de créer des objets constexpr de ces types.

Dans Dans l'exemple ci-dessous, le compilateur génère une erreur indiquant que l'expression nécessite une valeur constante :

#include <vector>
#include <string>

int main()
{
    constexpr std::string cs{ "hello" };
    constexpr std::vector cv{ 1, 2, 3 };
    return 0;
}
Copier après la connexion

Bien que Visual Studio 2019 version 16.11.4 prétend prendre en charge les vecteurs et les chaînes constexpr, ce problème provient d'une limitation dans Sémantique d'allocation constexpr de C 20.

Contrairement aux variables constexpr, les conteneurs constexpr C 20 ne prennent en charge que les transitoires allocation. Cela signifie que la mémoire allouée lors de l'évaluation constante doit être entièrement libérée avant la fin de l'évaluation. Cependant, les vecteurs nécessitent intrinsèquement une allocation de mémoire dynamique, ce qui entrave leur capacité à répondre à cette exigence.

Par conséquent, ce code est considéré comme mal formé car l'allocation de vecteur persiste :

constexpr std::vector<int> v = {1, 2, 3};
Copier après la connexion

Cependant, l'allocation transitoire peut toujours être utilisée dans des contextes constexpr. Prenons cet exemple :

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 de mémoire du vecteur est transitoire car la mémoire est libérée lorsque f() revient. Ainsi, il est permis d'utiliser std::vectors lors des évaluations constexpr, à condition que l'allocation soit transitoire.

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