Хранение постоянных строковых литералов в контейнере

#c #string #containers #c 17 #string-literals

Вопрос:

У меня есть структура foo bar формы struct foo { const char* s, ... }; и a std::vector<foo> v; , и я хочу push_back несколько foo s с постоянными значениями для поля s элемента, т. Е.

 bar.push_back({ "1", /*...*/ });
bar.push_back({ "2", /*...*/ });
bar.push_back({ "3", /*...*/ });
//...
 

Теперь, если я не совсем ошибаюсь, это небезопасно, так как время жизни строковых литералов ограничено областью скобок инициализатора. Таким образом, время жизни строкового литерала "1" уже должно было закончиться в строке второго push_back .

Как мы можем с этим справиться? Действительно ли нам нужно создать второй контейнер strong std::string и передать соответствующие c_str() указатели bar ?

Комментарии:

1. «время жизни строковых литералов ограничено» нет, это не так.

Ответ №1:

Это безопасно до тех пор, пока вы инициализируете только const char *s строковые литералы . Их срок службы идентичен сроку службы вашей программы.

Ответ №2:

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

Вы можете убедиться в этом, распечатав указатели const char* после приведения их к целому числу.

Следовательно, не может быть и речи о «времени жизни» строковых литералов больше, чем у константы 99 есть время жизни.

Они буквально буквальны