2015-09-18 6 views
7

Configurazione rapida: voglio passare le stringhe nel mio programma come un puntatore e una dimensione. Ho una classe String e un utente definito letterale per la costruzione di stringhe letterali:durata di memorizzazione dei dati di carattere sottostanti con stringa letterale definita dall'utente

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? 
} 

Ha lo standard specificare che l'argomento passato al mio operatore letterale definita dall'utente ha una durata statica? vale a dire il codice di cui sopra in realtà equivale a scrivere:

int main() { 
    String s{"hello", 5}; 
} 

o è il compilatore/linker permesso di lasciare me con un puntatore penzoloni quando uso il definita dall'utente letterale?

(la sezione 2.13.8 di N4527 non sembra dire nulla in merito alla classe di archiviazione dell'argomento per gli operatori letterali stringa definiti dall'utente. Qualsiasi puntatore nelle sezioni appropriate dello standard sarebbe apprezzato .)

+0

Sezione 2.13.8 alias [lex.ext] p5 sembra dire che l'argomento è un * string-literal * e che hanno una durata di archiviazione statica. – dyp

+0

@ dyp Non sono sicuro che sia chiaro, continuo avanti e indietro su quello –

+0

@ShafikYaghmour Ecco perché non l'ho postato come risposta;) – dyp

risposta

4

Da [lex.ext]:

Se L è un definita dall'utente-stringa-letterale, lasciate str essere il letterale senza il suo ud-suffisso e let len è il numero di unità di codice str (vale a dire, la sua lunghezza esclude il carattere null terminante). Il letterale L viene trattata come una chiamata della forma:

operator "" X (str , len) 

Da [lex.string]:

Valutare un stringa letterali risultati in un oggetto letterale stringa con durata dell'archiviazione statica, inizializzata dai caratteri specificati come specificato sopra.

Quindi:

"hello"_string; 

è equivalente a:

operator "" _string("hello", 5) 

Come "hello" è un stringhe letterali, che ha una durata di stoccaggio statico, in modo da avere alcun puntatore penzoloni.

+2

* "del modulo" * sembra un po 'vago, non dice * "equivalente a" *. Ad ogni modo, sono d'accordo con la nozione di base. – dyp

+0

@ dyp Sì, in altri contesti nello standard "* del modulo *" viene di solito presentata una struttura sintattica (ad esempio "un'espressione del modulo E1 op = E2 è equivalente a E1 = E1 op E2 ..."). Scarsa scelta di parole imo. – Barry

+0

C'è [dcl.fct.def.generale] p8, che non è sintattico; potrebbe significare "equivalente a" in quell'istanza. – dyp