Verstehen der Inkompatibilität von constexpr und dynamischer Speicherzuweisung mit std::vector und std::string in C 20
Trotz Dokumentation, die auf Unterstützung hinweist für constexpr std::string und std::vector in der Microsoft Visual Studio 2019-Version 16.11.4 können beim Versuch, diese Objekte mit constexpr zu erstellen, Fehler auftreten. Der Grund dafür liegt in der begrenzten Unterstützung der constexpr-Zuweisung in C 20.
In C 20 ist eine vorübergehende Zuweisung während der constexpr-Auswertung zulässig. Dies bedeutet, dass der während der konstanten Auswertung zugewiesene Speicher bis zum Abschluss vollständig freigegeben werden muss. Vektoren und Zeichenfolgen weisen jedoch Speicher dynamisch zu, was über den Bereich der konstanten Auswertung hinaus bestehen bleiben kann und somit gegen diese Regel verstößt.
Die Fehlermeldung „Der Ausdruck muss einen konstanten Wert haben“ weist darauf hin, dass der Compiler nicht garantieren kann, dass der zugewiesene Wert nicht gewährleistet ist Der Speicher wird am Ende der constexpr-Auswertung freigegeben. Folglich schlägt die versuchte Erstellung von constexpr std::vector- und std::string-Objekten fehl.
Im Gegensatz dazu kann std::array mit constexpr verwendet werden, da keine dynamische Speicherzuweisung erforderlich ist und seine Lebensdauer garantiert ist auf den konstanten Evaluierungszeitraum beschränkt werden.
Um dieses Problem zu beheben, stellen Sie sicher, dass Sie nur versuchen, constexpr-Objekte zu erstellen, wenn ihre Lebensdauer vorübergehend ist, also vollständig bis zum Ende der ständigen Auswertung freigegeben. Diese Einschränkung schränkt die Verwendung der dynamischen Speicherzuweisung innerhalb von constexpr-Kontexten ein.
Das obige ist der detaillierte Inhalt vonWarum kann ich „constexpr' nicht mit „std::vector' und „std::string' in C 20 verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!