Heim >Backend-Entwicklung >C++ >Warum schlägt die Kompilierung meines C 20 „constexpr' „std::vector' und „std::string' fehl?
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 };
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);
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!