Быстрая настройка: я хочу передавать строки в своей программе как указатель и размер. У меня есть класс 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, похоже, ничего не говорит о классе хранения аргумента для определяемых пользователем строковых литеральных операторов. Любые указатели на соответствующие разделы стандарта будут оценены.)