Насколько я знаю, std :: string может делать что угодно внутри!
Для всех вы знаете. Стандарт, конечно, описывает и требует определенной семантики, которая исключает что-либо . В шаблоне basic_string
написано следующее:
§21.4 [basic.string] p1
Шаблон класса basic_string
описывает объекты, которые могут хранить последовательность, состоящую из различного числа произвольных подобных символу объектов с первым элементом последовательности в нулевой позиции. Такая последовательность также называется «строкой», если тип хранящихся в ней символов, подобных ей, ясен из контекста. В оставшейся части этого раздела тип объектов типа char, содержащихся в объекте basic_string
, обозначается charT
.
А «символоподобный объект» определяется следующим текстом:
§21.1 [strings.general] p1
В этом разделе описываются компоненты для управления последовательностями любого типа, не являющегося массивом POD (3.9). В этом разделе такие типы называются символоподобными типами , а объекты типоподобных типов называются символоподобными объектами или просто символами .
Это фактически означает, что вы можете вставить все, что вы хотите, в basic_string
, если это не массив, а POD (см. this и this для получения информации о что такое PODы). Этими подобными символу объектами затем манипулируют с помощью черт характера, которые определяют специфическое поведение и отношения между ними.
[...] но как я узнаю, что метод не создает новый массив c char из каких-либо данных, которые он хранит внутри, и возвращает его?
В C ++ 03 именно это можно было сделать для реализации, известный дефект, который с тех пор был исправлен в C ++ 11:
§2.4.1 [string.require] p5
Подобные символу объекты в объекте basic_string
должны храниться непрерывно. То есть для любого basic_string
объекта s
тождество &*(s.begin() + n) == &*s.begin() + n
должно сохраняться для всех значений n
, таких что 0 <= n < s.size()
.
См. Также эти связанные вопросы: