Мета будь-яких пропозицій "посилання на рядок" та "посилання на масив" полягає в тому, щоб уникнути копіювання даних, які вже належать десь в іншому місці, і для яких потрібен лише вид, який не змінюється. string_view
У питанні одне таку пропозицію; були раніше названі string_ref
і array_ref
теж.
Ідея полягає у тому, щоб завжди зберігати пару вказівника на перший елемент та розмір деякого існуючого масиву даних або рядка.
Такий клас обробки зображень міг би дешево обійтись за значенням і запропонував би дешеві операції підрядки (які можна реалізувати як прості збільшення кроків вказівника та коригування розміру).
Для багатьох застосувань рядків не потрібне фактичне володіння рядками, а рядком, про який йде мова, часто вже належить хтось інший. Тож існує справжній потенціал для підвищення ефективності, уникаючи зайвих копій (подумайте про всі виділення та винятки, які ви можете зберегти).
Оригінальні рядки C страждали від проблеми з тим, що нульовий термінатор був частиною рядкових API, і тому ви не могли легко створити підрядки, не змінивши нижній рядок (a la strtok
). У C ++ це легко вирішити, зберігаючи довжину окремо і загортаючи вказівник та розмір в один клас.
Однією з головних перешкод та розбіжностей зі стандартною філософією бібліотеки C ++, яку я можу придумати, є те, що такі класи "референційного погляду" мають абсолютно іншу семантику власності від решти стандартної бібліотеки. В основному все інше в стандартній бібліотеці є безумовно безпечним і правильним (якщо вона компілюється, то правильно). З такими довідковими класами це вже не відповідає дійсності. Правильність вашої програми залежить від зовнішнього коду, який використовує ці класи. Так що це важче перевірити і навчити.