Heim > Backend-Entwicklung > C++ > Warum schlägt die Kompilierung meines C 20 „constexpr' „std::vector' und „std::string' fehl?

Warum schlägt die Kompilierung meines C 20 „constexpr' „std::vector' und „std::string' fehl?

Patricia Arquette
Freigeben: 2024-12-01 20:05:14
Original
796 Leute haben es durchsucht

Why Are My C  20 `constexpr` `std::vector` and `std::string` Failing Compilation?

C 20 Consexpr Vector und String funktionieren nicht? Eine Geschichte der vorübergehenden Zuordnung

Beim Versuch, constexpr std::string- und std::vector-Objekte zu erstellen, kann ein rätselhafter Compilerfehler auftreten. Obwohl die neueste unterstützte Visual Studio-Version verwendet wird, heißt es in der Fehlermeldung: „Der Ausdruck muss einen konstanten Wert haben.“

Das Problem

Der bereitgestellte Code verwendet Folgendes:

constexpr std::string cs{ "hello" };
constexpr std::vector cv{ 1, 2, 3 };
Nach dem Login kopieren

Der Compiler beschwert sich jedoch und weist auf fehlende Details hin.

Die Lösung

Das Problem ergibt sich aus der begrenzten Unterstützung von C 20 für die constexpr-Zuweisung. Insbesondere ist eine vorübergehende Zuordnung erforderlich. Dies bedeutet, dass jeglicher während der ständigen Auswertung zugewiesener Speicher freigegeben werden muss, bevor die Auswertung abgeschlossen ist.

Vektoren können aufgrund der dynamischen Speicherzuweisung nicht als Konstanten gespeichert werden, da ihr Speicher nach der Auswertung bestehen bleibt. Daher der Fehler „Zeigt auf Speicher, der während der konstanten Auswertung dem Heap zugewiesen wurde.“

Beispiel für eine vorübergehende Zuweisung

Vektoren können zwar nicht als Konstanten deklariert werden, sie können jedoch kann während constexpr-Funktionen mit transienter Zuweisung verwendet werden:

constexpr int f() {
    std::vector<int> v = {1, 2, 3};
    return v.size();
}

static_assert(f() == 3);
Nach dem Login kopieren

In diesem Code wird der Speicher des Vektors freigegeben, wenn f() kehrt zurück, wodurch die Zuordnung vorübergehend wird und in einer constexpr-Funktion verwendet werden kann.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Kompilierung meines C 20 „constexpr' „std::vector' und „std::string' fehl?. 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