string_view
era una característica propuesta dentro de C ++ Library Fundamentals TS ( N3921 ) agregada a C ++ 17
Según tengo entendido, es un tipo que representa algún tipo de "concepto" de cadena que es una vista de cualquier tipo de contenedor que podría almacenar algo visible como una cadena.
- Es esto correcto ?
- ¿Debería
const std::string&
convertirse el tipo de parámetro canónicostring_view
? - ¿Hay otro punto importante
string_view
a tener en cuenta?
Respuestas:
El propósito de todos y cada uno de los tipos de propuestas de "referencia de cadena" y "referencia de matriz" es evitar copiar datos que ya son propiedad de otro lugar y de los cuales solo se requiere una vista no mutante. La
string_view
en cuestión es una de esas propuestas; hubo otros llamadosstring_ref
yarray_ref
también.La idea siempre es almacenar un par de puntero al primer elemento y el tamaño de una matriz o cadena de datos existente .
Tal clase de manejador de vista podría transmitirse de forma económica por valor y ofrecería operaciones de subcadena baratas (que pueden implementarse como simples incrementos de puntero y ajustes de tamaño).
Muchos usos de cadenas no requieren la posesión real de las cadenas, y la cadena en cuestión a menudo ya será propiedad de otra persona. Por lo tanto, existe un verdadero potencial para aumentar la eficiencia al evitar copias innecesarias (piense en todas las asignaciones y excepciones que puede guardar).
Las cadenas C originales sufrían el problema de que el terminador nulo formaba parte de las API de cadena, por lo que no podía crear subcadenas fácilmente sin mutar la cadena subyacente (a la
strtok
). En C ++, esto se resuelve fácilmente almacenando la longitud por separado y envolviendo el puntero y el tamaño en una clase.El principal obstáculo y divergencia de la filosofía de la biblioteca estándar de C ++ que se me ocurre es que tales clases de "vista referencial" tienen una semántica de propiedad completamente diferente del resto de la biblioteca estándar. Básicamente, todo lo demás en la biblioteca estándar es incondicionalmente seguro y correcto (si se compila, es correcto). Con clases de referencia como esta, eso ya no es cierto. La exactitud de su programa depende del código ambiental que utiliza estas clases. Eso es más difícil de verificar y enseñar.
fuente
reference_wrapper
, ¿no?string_view
. (No estaba diciendo que nunca se puede escribir código roto. Solo que el roto es local ).std::range
deboost::iterator_range
- IMO es mejor que la idea de string_view