string_view
была предложенной функцией в C++ Library Fundamentals TS(N3921), добавленной в C++17
Насколько я понимаю, это тип, представляющий некую "концепцию" строки, которая является представлением любого типа контейнера, который может хранить что-то, просматриваемое как строка.
const std::string&
тип параметров должен стать string_view
?string_view
, который следует принять во внимание?Цель всех и всяческих предложений "строковой ссылки" и "ссылки на массив" - избежать копирования данных, которые уже принадлежат где-то еще и для которых требуется только неизменяющееся представление. Рассматриваемый string_view
является одним из таких предложений; были и более ранние, называвшиеся string_ref
и array_ref
.
Идея всегда заключается в хранении пары указателя на первый элемент и размер некоторого существующего массива данных или строки.
Такой класс view-handle может дешево передаваться по значению и предлагать дешевые операции подстроки (которые могут быть реализованы как простое увеличение указателя и изменение размера).
Многие виды использования строк не требуют фактического владения строками, и рассматриваемая строка часто уже принадлежит кому-то другому. Таким образом, существует реальный потенциал для повышения эффективности за счет отказа от ненужных копий (подумайте обо всех выделениях и исключениях, которые вы можете сэкономить).
Оригинальные строки на C страдали от проблемы, что нулевой терминатор был частью строкового API, и поэтому вы не могли легко создавать подстроки без изменения базовой строки (а-ля strtok
). В C++ эта проблема легко решается хранением длины отдельно и обертыванием указателя и размера в один класс.
Единственное серьезное препятствие и отклонение от философии стандартной библиотеки C++, о котором я могу думать, это то, что такие классы "ссылочного представления" имеют совершенно отличную семантику владения от остальной стандартной библиотеки. В принципе, все остальное в стандартной библиотеке безусловно безопасно и корректно (если оно компилируется, то оно корректно). С такими ссылочными классами, как этот, это уже не так. Корректность вашей программы зависит от окружающего кода, который использует эти классы. Так что это сложнее проверить и научить.