Быстрая настройка: я хочу передать строки в моей программе как указатель и размер. У меня есть класс String, и определенный пользователь буквальным для построения строковых литералов:Длительность хранения лежащих в основе символов с пользовательским строковым литералом
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?
}
Указан ли стандарт, что аргумент, передаваемый в мой определенном пользователе буквального оператора имеет статическую продолжительность? то есть это выше код фактически эквивалентна запись:
int main() {
String s{"hello", 5};
}
или компилятор/линкер разрешено оставить меня с оборванным указателем, когда я использую определенный пользователь буквальным?
(Раздел 2.13.8 из N4527, похоже, ничего не сказал о классе хранения аргумента для пользовательских операторов строковых литералов. Любые указатели в соответствующие разделы стандарта будут оценены .)
Раздел 2.13.8 aka [lex.ext] p5, похоже, говорит, что аргумент является * строковым литералом *, и они имеют статическую продолжительность хранения. – dyp
@dyp Я не уверен, что это ясно, хотя я продолжаю идти туда и обратно по этому поводу –
@ShafikYaghmour Вот почему я не опубликовал его как ответ;) – dyp