В С++ 11 мы знаем, что std::string
гарантированно будет как смежным, так и завершающим нуль (или более педантичным, заканчивается на charT()
, который в случае char
является нулевым символом 0).
Существует такой API C, который мне нужно использовать, который заполняет строку указателем. Он записывает всю строку + нулевой ограничитель. В С++ 03 мне всегда приходилось использовать vector<char>
, потому что я не мог предположить, что string
был смежным или завершенным нулем. Но в С++ 11 (предполагая правильно соответствующий basic_string
класс, который по-прежнему сохраняется в некоторых стандартных библиотеках), я могу.
Или я могу? Когда я это сделаю:
std::string str(length);
Строка будет выделять length+1
байты, причем последний заполняется нулевым терминатором. Это хорошо. Но когда я передаю это API C, он напишет символы length+1
. Он собирается перезаписать нуль-терминатор.
По общему признанию, он собирается перезаписать нуль-терминатор нулевым символом. Коэффициенты хороши, что это сработает (действительно, я не могу себе представить, как он не может работать).
Но мне все равно, что "работает". Я хочу знать, согласно спецификации, нормально ли перезаписывать нулевой ограничитель нулевым символом?