Unter Verwendung von C ++ 11, Ubuntu 14.04, GCC Standard-Toolchain .
Dieser Code schlägt fehl:
constexpr std::string constString = "constString";
Fehler: Der Typ 'const string {aka const std :: basic_string}' der constexpr-Variablen 'constString' ist nicht wörtlich ... weil ... 'std :: basic_string' einen nicht trivialen Destruktor hat
Ist es möglich, std::string
in einem zu verwenden constexpr
? (anscheinend nicht ...) Wenn ja, wie? Gibt es eine alternative Möglichkeit, eine Zeichenfolge in a zu verwenden constexpr
?
std::string
ist kein wörtlicher Typstd::string
constexpr sein willst? Auf SO gibt es mehrere Implementierungen von Zeichenfolgen zur Kompilierungszeit. Was bringt es, zu fragen, ob Sie einen nicht-wörtlichen Typ constexpr erstellen können, wenn Sie die Fehlermeldung verstehen und wissen, dass nur wörtliche Typen constexpr erstellt werden können? Es gibt auch mehrere Gründe, warum man eine constexpr-Instanz haben möchte, daher schlage ich vor, dass Sie Ihre Frage klärenconstexpr
String-Implementierungen da draußen.std::string
ist keiner von ihnen.Antworten:
Nein, und Ihr Compiler hat Ihnen bereits eine umfassende Erklärung gegeben.
Aber Sie könnten dies tun:
Zur Laufzeit kann dies verwendet werden, um
std::string
bei Bedarf eine zu erstellen .quelle
constexpr auto constString = "constString";
? Keine Notwendigkeit, diese hässliche Array-Syntax zu verwenden ;-)char[]
ist ausführlicher / klarer alsauto
wenn ich versuche, den zu verwendenden Datentyp hervorzuheben.auto
;-)constexpr auto s = "c"sv;
aufgrund der Einführung vonstring_view
Ab C ++ 20 ja.
Ab C ++ 17 können Sie Folgendes verwenden
string_view
:A
string_view
ist einstring
ähnliches Objekt, das als unveränderlicher, nicht besitzender Verweis auf eine beliebige Folge vonchar
Objekten fungiert.quelle
const std::string&
einen neuen std :: string erstellt, erstellt werden muss. Das ist normalerweise das Gegenteil von dem, was man beim Erstellen einer Konstante im Sinn hatte. Daher neige ich dazu zu sagen, dass dies keine gute Idee ist. Zumindest muss man vorsichtig sein.string_view
ist nicht implizit in konvertierbarstring
, daher besteht nur eine geringe Gefahr, dass versehentlich einstring
aus einem erstellt wirdstring_view
. Umgekehrtchar const*
ist implizit konvertierbar instring
, so dass die Verwendungstring_view
in diesem Sinne tatsächlich sicherer ist.string_view
nicht implizit konvertierbar iststring
. IMO ist das Problem, das ich angesprochen habe, immer noch gültig, gilt aber nichtstring_view
speziell für. Wie Sie bereits erwähnt haben, ist dies in dieser Hinsicht sogar noch sicherer.string_view
ist, anstatt nur einen Link.C ++ 20 fügt
constexpr
Zeichenfolgen und Vektoren hinzuDer folgende Vorschlag wurde anscheinend angenommen : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf und fügt Konstruktoren hinzu, wie:
zusätzlich zu constexpr Versionen aller / der meisten Methoden.
Ab GCC 9.1.0 gibt es keine Unterstützung. Folgendes kann nicht kompiliert werden:
mit:
mit Fehler:
std::vector
diskutiert unter: constexpr std :: vector kann nicht erstellt werdenGetestet in Ubuntu 19.04.
quelle
Da das Problem der nicht triviale Destruktor ist
std::string
, kann eineconstexpr
Instanz dieses Typs definiert werden , wenn der Destruktor aus dem entfernt wird . So wasquelle
string_view
ist, mit der Ausnahme , dassstring_view
Sie die meisten Funktionen gibt , dass Sie wissen ausstd::string