2015-09-18 9 views
7

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 .)

+0

Abschnitt 2.13.8 aka [lex.ext] p5 scheint zu sagen, dass das Argument ein * string-literal * ist, und diese haben statische Speicherdauer. – dyp

+0

@dyp Ich bin mir nicht sicher, ob das klar ist, ich gehe immer wieder hin und her –

+0

@ShafikYaghmour Deshalb habe ich es nicht als Antwort gepostet;) – dyp

Antwort

4

Von [lex.ext]:

Wenn L ein benutzerdefinierten-string-literal, str lassen sein, die wörtlichen ohne seinen ud-Suffix ist und lass len ist die Anzahl der Codeeinheiten in Str (d. H. Ihre Länge schließt das abschließende Nullzeichen aus). Die wörtliche L wird als Aufruf des Formulars behandelt:

operator "" X (str , len) 

Von [lex.string]:

eine Auswertung String-wörtliche Ergebnisse in einem Stringliteral Objekt mit statische Speicherdauer, initialisiert aus den angegebenen Zeichen wie oben angegeben.

So:

"hello"_string; 

entspricht:

operator "" _string("hello", 5) 

Als "hello" ist ein String-wörtliche, es statische Speicherdauer hat, so haben Sie keine baumelnden Zeiger haben.

+2

* "der Form" * scheint ein bisschen vage, es sagt nicht * "entspricht" *. Jedenfalls stimme ich dem Grundgedanken zu. – dyp

+0

@dyp Ja, in anderen Kontexten im Standard "* der Form *" ist normalerweise eine syntaktische Struktur vorhanden (z. B. "ein Ausdruck der Form E1 op = E2 ist äquivalent zu E1 = E1 op E2 ..."). Schlechte Formulierung imo. – Barry

+0

Es gibt [dcl.fct.def.allgemein] p8, obwohl das nicht syntaktisch ist; es könnte in diesem Fall "äquivalent" bedeuten. – dyp