Quick-Setup: Ich möchte Strings in meinem Programm als Zeiger und eine Größe übergeben. Ich habe eine String-Klasse und ein benutzerdefinierte wörtliche für die Konstruktion wörtliche Strings:Speicherdauer der zugrunde liegenden Zeichendaten mit benutzerdefinierten String-Literal
struct String { const char *ptr; size_t sz; };
inline constexpr String operator "" _string(const char *s, size_t sz) {
return {s, sz};
}
int main() {
auto s = "hello"_string;
s.ptr[0]; //<-- is this access guaranteed to work?
}
Ist der Standard festlegen, dass das Argument für meinen benutzerdefinierten Literaloperator bestand statische Dauer hat? d ist der obige Code tatsächlich entspricht Schreiben:
int main() {
String s{"hello", 5};
}
oder ist der Compiler/Linker mit einem baumelnden Zeiger lassen mir erlaubt, wenn ich die benutzerdefinierte wörtlichen verwenden?
(Abschnitt 2.13.8 von N4527 schien nichts zum Thema Speicherklasse des Arguments zu den benutzerdefinierten String-Literal-Operatoren zu sagen. Alle Hinweise auf die entsprechenden Abschnitte des Standards würden geschätzt werden .)
Abschnitt 2.13.8 aka [lex.ext] p5 scheint zu sagen, dass das Argument ein * string-literal * ist, und diese haben statische Speicherdauer. – dyp
@dyp Ich bin mir nicht sicher, ob das klar ist, ich gehe immer wieder hin und her –
@ShafikYaghmour Deshalb habe ich es nicht als Antwort gepostet;) – dyp