Использование string :: c_str () и data () по стандартам до C ++ 11 - PullRequest
0 голосов
/ 03 июня 2018

Согласно этому ответу , внутренний буфер std::string не гарантированно является непрерывным в соответствии со стандартами до C ++ 11.(Хотя почти во всех реализациях используется непрерывная память)

Технически это означает, что доступ к n-му (n> 0?) Элементу возвращаемого значения string::data() или string::c_str() вызывает неопределенное поведение.Это правильно?

std::string str = "Hello, World!"
str.c_str()[1]; // Which is equivalent to *(str.c_str() + 1), therefore UB?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

str.c_str()[...]; нормально, пока вы не выбежали за конец строки.В конце концов, это строка C, что еще вы ожидаете?

Что касается str.data(), cppreference , то есть:

const CharT* data() constвозвращает указатель на базовый массив, служащий хранилищем символов.Указатель таков, что диапазон [data ();data () + size ()) является допустимым, и значения в нем соответствуют значениям, хранящимся в строке.

Теперь я не знаю, заслуживает ли это доверия, но cppreference не подходитэто заявление применительно к любой конкретной версии стандарта.Но, наверное, так и должно быть.

0 голосов
/ 03 июня 2018

Нет, поскольку в спецификации C ++ 98 четко указано, что вы получаете: непрерывный массив символов.

Внутренняя реализация хранилища строк не обязательно отражается в результатах метода.Если строка не хранится в одной части, методы должны убедиться, что вы получите то, что хотите.Это может означать, что весь контент копируется в другое место.

По этой причине вам не следует изменять полученное строковое представление.

Вы и лицо, реализующее методыоба должны внимательно прочитать стандарт, описывающий, что вы получаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...