2015-09-18 3 views
7

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

+0

Раздел 2.13.8 aka [lex.ext] p5, похоже, говорит, что аргумент является * строковым литералом *, и они имеют статическую продолжительность хранения. – dyp

+0

@dyp Я не уверен, что это ясно, хотя я продолжаю идти туда и обратно по этому поводу –

+0

@ShafikYaghmour Вот почему я не опубликовал его как ответ;) – dyp

ответ

4

Из [lex.ext]:

Если L является определенный пользователем строка-буквальным, пусть ул быть в буквального без его уд-суффикс и let len - число единиц кода в str (т. Е. Его длина, исключая конечный нулевой символ). Буквальный L трактуются как вызов формы:

operator "" X (str , len) 

Из [lex.string]:

оценки строк литералов результатов в струнном буквальном объекте с статическая продолжительность хранения, инициализированная из заданных символов, как указано выше.

Итак:

"hello"_string; 

эквивалентен:

operator "" _string("hello", 5) 

Как "hello" является строковым литералом, он имеет статическую продолжительность хранения, так что вы не будете иметь оборванный указатель.

+2

* «Форма» * кажется немного расплывчатой, она не говорит * «эквивалентна» *. Во всяком случае, я согласен с основным понятием. – dyp

+0

@ dyp Да, в других контекстах в стандарте «* формы *» обычно присутствует синтаксическая структура (например, «выражение формы E1 op = E2 эквивалентно E1 = E1 op E2 ...»). Плохой выбор слов imo. – Barry

+0

Существует [dcl.fct.def.вообще] p8, хотя и не является синтаксическим; это может означать «эквивалент» в этом случае. – dyp

 Смежные вопросы

  • Нет связанных вопросов^_^