Heim > Backend-Entwicklung > C++ > Warum führen „constexpr'-Vektoren und -Strings in C 20 zu vorübergehenden Zuordnungsfehlern?

Warum führen „constexpr'-Vektoren und -Strings in C 20 zu vorübergehenden Zuordnungsfehlern?

Linda Hamilton
Freigeben: 2024-12-03 06:20:14
Original
301 Leute haben es durchsucht

Why Do `constexpr` Vectors and Strings in C  20 Lead to Transient Allocation Errors?

constexpr C 20 Vektoren und Strings: Ein vorübergehendes Zuordnungsdilemma

Obwohl der C 20-Standard constexpr-Unterstützung für Vektoren und Strings einführt, können Entwickler dies tun Beim Versuch, daraus constexpr-Objekte zu erstellen, treten unerwartete Compilerfehler auf Typen.

Im folgenden Beispiel gibt der Compiler einen Fehler aus, der darauf hinweist, dass der Ausdruck einen konstanten Wert erfordert:

#include <vector>
#include <string>

int main()
{
    constexpr std::string cs{ "hello" };
    constexpr std::vector cv{ 1, 2, 3 };
    return 0;
}
Nach dem Login kopieren

Obwohl Visual Studio 2019 Version 16.11.4 behauptet, constexpr-Vektoren zu unterstützen und Bei Zeichenfolgen ist dieses Problem auf eine Einschränkung in der constexpr-Zuweisungssemantik von C 20 zurückzuführen.

Im Gegensatz zu constexpr-Variablen, C 20 constexpr-Container unterstützen nur die vorübergehende Zuordnung. Dies bedeutet, dass der bei der ständigen Auswertung allokierte Speicher vor dem Ende der Auswertung vollständig freigegeben werden muss. Vektoren erfordern jedoch von Natur aus eine dynamische Speicherzuweisung, was sie daran hindert, diese Anforderung zu erfüllen.

Daher wird dieser Code als fehlerhaft angesehen, da die Vektorzuweisung bestehen bleibt:

constexpr std::vector<int> v = {1, 2, 3};
Nach dem Login kopieren

Die vorübergehende Zuordnung kann jedoch weiterhin in constexpr-Kontexten verwendet werden. Betrachten Sie dieses Beispiel:

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

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

In diesem Fall ist die Speicherzuweisung des Vektors vorübergehend, da der Speicher freigegeben wird, wenn f() zurückkehrt. Daher ist es zulässig, std::vectors während constexpr-Auswertungen zu verwenden, vorausgesetzt, dass die Zuweisung vorübergehend ist.

Das obige ist der detaillierte Inhalt vonWarum führen „constexpr'-Vektoren und -Strings in C 20 zu vorübergehenden Zuordnungsfehlern?. 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