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 .)
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
@ dyp Non sono sicuro che sia chiaro, continuo avanti e indietro su quello –
@ShafikYaghmour Ecco perché non l'ho postato come risposta;) – dyp