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
Freigeben: 2024-12-06 10:42:13
Original
544 Leute haben es durchsucht

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};
}
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage