Что такое string_view?

string_view представляется предлагаемой функцией в Основах библиотеки С++ TS: N3921

Насколько я понимаю, это тип, который представляет собой некоторую строку "концепция", которая представляет собой представление о любом типе контейнера, который может хранить что-то видимое в виде строки.

  • Это правильно?
  • Если это предложение будет принято, каноническое const std::string& Тип параметра становится string_view?
  • Есть ли еще один важный момент в отношении string_view?

Ответ 1

Цель любых и всех типов предложений "ссылка на строку" и "ссылка на массив" заключается в том, чтобы избежать копирования данных, которые уже находятся в другом месте и из которых требуется только не мутирующий вид. Рассматриваемый string_view является одним из таких предложений; раньше были и те, которые назывались string_ref и array_ref.

Идея заключается в том, чтобы хранить пару указателей на первый элемент и размер какого-либо существующего массива данных или строки.

Такой класс view-handle может быть передан дешево по стоимости и будет предлагать дешевые операции подстановки (которые могут быть реализованы как простые приращения указателя и корректировки размера).

Многие применения строк не требуют фактического владения строками, и данная строка часто уже принадлежит кому-то другому. Таким образом, существует реальный потенциал для повышения эффективности, избегая ненужных копий (подумайте обо всех распределениях и исключениях, которые вы можете сохранить).

Исходные строки C страдали от проблемы, что нулевой терминатор был частью API-интерфейсов строк, и поэтому вы не могли легко создавать подстроки без изменения основной строки (a la strtok). В С++ это легко решить, сохраняя длину отдельно и обертывая указатель и размер в один класс.

Единственное серьезное препятствие и отклонение от философии стандартной библиотеки С++, о которой я могу думать, это то, что такие классы "ссылочного вида" имеют совершенно другую семантику собственности от остальной стандартной библиотеки. В принципе, все остальное в стандартной библиотеке безоговорочно безопасно и правильно (если оно компилируется, оно правильно). С такими ссылочными классами это уже не так. Правильность вашей программы зависит от окружающего кода, который использует эти классы. Так что сложнее проверить и учить.