Ответ 1
Поддержка С++ 11 для базового буфера string
становится возможной дополнительным требованием к basic_string
:
Элементы a
basic_string
сохраняются смежно, т.е. для abasic_string s
,&*(s.begin() + n) == &*s.begin() + n
для любогоn
в [0
,s.size()
) или, что эквивалентно, указатель наs[0]
может быть передан функциям, которые ожидают указатель на первый элемент массиваCharT[]
.
Этот базовый буфер может быть получен различными способами, например: &s.front()
, &s[0]
или &*s.first()
Но этот вопрос: Почему не было доступа к string
базовому буфере, предоставленному в форма char* string::data()
? Таким образом, устранение требования для вызывающего пользователя разыменовать возврат метода string
.
Чтобы ответить на это, важно отметить, что T* array<T>::data()
и T* vector<T>::data()
были добавлением, необходимым для С++ 11. Никакие дополнительные требования не были предъявлены С++ 11 к другим смежным контейнерам, таким как deque
и string
. const char* string::data()
, однако существовал до С++ 11 с требованием:
Возвращаемый массив не должен быть завершен с нулем.
Это означает, что string
не был "заменен" в переходе С++ 11 на data
accessors, он просто не был включен. Хотя есть естественные недостатки в реализации С++ 11, которые требуют записи непосредственно в базовый буфер string
, настоящая потребность в методе char* string::data()
на С++ 17, где data
function not method может использоваться для доступа к базовому буферу контейнеров. Это ускоряет изменение, которое указывает Alper:
std::basic_string<charT>::data()
возвращает aconst charT*
21.4.7.1 [string.accessors]. Хотя этот метод удобен, он не совсем соответствуетstd::array<T>::data()
23.3.2.5 [array.data] илиstd::vector<T>::data()
23.3.6.4 [vector.data], оба из которых предоставляют две версии (которые возвращаютT*
илиconst T*
). Дополнительный методdata()
может быть добавлен вstd::basic_string
, который возвращаетcharT*
, поэтому его можно использовать в аналогичных ситуациях, в которых могут использоватьсяstd::array
иstd::vector
. Без методаconst data()
std::basic_string
должен обрабатываться специально в коде, который иначе не обращается к используемому типу контейнера.
В момент написания это актуальная проблема в Library Evolution Work Group.