Heim >Backend-Entwicklung >C++ >Warum funktionieren mein C 20 „constexpr' „std::vector' und „std::string' nicht?

Warum funktionieren mein C 20 „constexpr' „std::vector' und „std::string' nicht?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-06 10:42:13566Durchsuche

Why Aren't My C  20 `constexpr` `std::vector` and `std::string` Working?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn