C 20 constexpr-Vektor und String funktionieren nicht
In diesem Problem versucht ein Programmierer, constexpr-Objekte von std::string und std zu erstellen ::vector, es tritt jedoch ein Compilerfehler auf, der besagt, dass der Ausdruck einen konstanten Wert haben muss. Das Problem tritt auf, obwohl die neueste Version von Microsoft Visual Studio 2019 verwendet wird, die constexpr-Zeichenfolgen und -Vektoren unterstützt.
Problemerklärung
Der Fehler ist auf die eingeschränkte Unterstützung der constexpr-Zuordnung zurückzuführen C 20, was nur eine vorübergehende Zuordnung ermöglicht. Bei der vorübergehenden Zuweisung muss der zugewiesene Speicher bis zum Ende der konstanten Auswertung vollständig freigegeben werden.
Beispiel für ungültigen Code
Das folgende Beispiel veranschaulicht den Fehler:
int main() { constexpr std::vector<int> v = {1, 2, 3}; }
Hier bleibt die Zuweisung für v bestehen, sodass sie nicht vorübergehend ist. Der Compiler erzeugt korrekt einen Fehler, der darauf hinweist, dass der Ausdruck nicht zu einer Konstante ausgewertet wurde, da v während der Konstantenauswertung eine Heap-Zuweisung beibehält.
Beispiel für gültigen Code
Allerdings , die Verwendung von std::vector während der constexpr-Zeit ist mit transienter Zuweisung möglich.
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
In diesem Beispiel ist die Zuweisung von v vorübergehend, da der Speicher freigegeben wird, wenn f() zurückkehrt. Dies ermöglicht die Verwendung von std::vector während der constexpr-Zeit.
Das obige ist der detaillierte Inhalt vonWarum funktionieren mein C 20 „constexpr' „std::vector' und „std::string' nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!