Законно ли перезаписывать нулевой терминатор std :: string?

В C ++ 11 мы знаем, чтоstd::string гарантированно будет как непрерывным, так и нулевым (или, более педантично, завершеннымcharT()который в случаеchar нулевой символ 0).

Мне нужен этот C API, который заполняет строку указателем. Он записывает всю строку + нулевой терминатор. В C ++ 03 я всегда был вынужден использоватьvector<char>потому что я не мог предположить, чтоstring был смежным или нулевым. Но в C ++ 11 (при условии надлежащего соответствияbasic_string класс, который все еще сомнительный в некоторых стандартных библиотеках), я могу.

Или я могу? Когда я делаю это:

std::string str(length);

Строка будет выделятьlength+1 байты, с последним заполненным нулевым терминатором. Это хорошо. Но когда я передаю это C API, он собирается написатьlength+1 персонажи. Он будет перезаписывать нулевой терминатор.

По общему признанию, это собирается перезаписать нулевой терминаторwith a null character, Хорошие шансы, что это сработает (на самом деле, я не могу себе представить, как этоcouldn't Работа).

Но мне все равно, что «работает». Я хочу знать,according to the specМожно ли перезаписать нулевой терминатор нулевым символом?

Ответы на вопрос(4)

Ваш ответ на вопрос