Ответ 1
Цель любых и всех типов предложений "ссылка на строку" и "ссылка на массив" заключается в том, чтобы избежать копирования данных, которые уже находятся в другом месте и из которых требуется только не мутирующий вид. Рассматриваемый string_view
является одним из таких предложений; раньше были и те, которые назывались string_ref
и array_ref
.
Идея заключается в том, чтобы хранить пару указателей на первый элемент и размер какого-либо существующего массива данных или строки.
Такой класс view-handle может быть передан дешево по стоимости и будет предлагать дешевые операции подстановки (которые могут быть реализованы как простые приращения указателя и корректировки размера).
Многие применения строк не требуют фактического владения строками, и данная строка часто уже принадлежит кому-то другому. Таким образом, существует реальный потенциал для повышения эффективности, избегая ненужных копий (подумайте обо всех распределениях и исключениях, которые вы можете сохранить).
Исходные строки C страдали от проблемы, что нулевой терминатор был частью API-интерфейсов строк, и поэтому вы не могли легко создавать подстроки без изменения основной строки (a la strtok
). В С++ это легко решить, сохраняя длину отдельно и обертывая указатель и размер в один класс.
Единственное серьезное препятствие и отклонение от философии стандартной библиотеки С++, о которой я могу думать, это то, что такие классы "ссылочного вида" имеют совершенно другую семантику собственности от остальной стандартной библиотеки. В принципе, все остальное в стандартной библиотеке безоговорочно безопасно и правильно (если оно компилируется, оно правильно). С такими ссылочными классами это уже не так. Правильность вашей программы зависит от окружающего кода, который использует эти классы. Так что сложнее проверить и учить.