#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 есть время жизни.
Они буквально буквальны