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