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
Patricia ArquetteOriginal
2024-12-01 20:05:14743Durchsuche

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 };

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!

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